我正在搞乱JAX-RS并创建了一个调用生成JSON的REST服务的应用程序.我试过Jersey,一切都很顺利,但我不得不切换到RESTEasy,因为我的应用程序需要用JDK5构建.我将web.xml更改为以下内容:
<web-app>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<servlet>
<servlet-name>RESTEasy</servlet-name>
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RESTEasy</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>
Run Code Online (Sandbox Code Playgroud)
所以我希望每个以/ rest开头的URL都由RESTEasy处理.我的服务如下:
@Path("/services")
public class MyRESTServices {
@GET
@Path("service1")
@Produces(MediaType.APPLICATION_JSON)
public Object service1(Blah blah) {
}
}
Run Code Online (Sandbox Code Playgroud)
使用Jersey工作正常,http:// localhost/MyContext/rest/services/service1绑定到我的service1()方法.但是,当我改为RESTEasy时,我有一个404:
HTTP状态404 - 无法找到相对的资源:/ rest/services/service1 of full path:http:// localhost/MyContext/rest/services/service1
这意味着RESTEasy处理了请求但找不到绑定到此URL的任何服务.
然而,在我的课堂上,@Path("/services")改为@Path("/rest/services")工作.你知道我为什么会有这种奇怪的行为吗?我读过的所有教程/文档都只提到相对路径,不包括/ rest前缀...
我尝试将Jersey中的字符串列表作为JSON和XML返回.我认为这将是微不足道的.
我的第一次尝试是写这样的东西
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Path("/bar")
public List<String> get() {
return dao.get();
}
Run Code Online (Sandbox Code Playgroud)
我期待一个与此类似的输出:["string1",...,"stringN"不幸的是我得到了这个:
com.sun.jersey.api.MessageException: A message body writer for Java class java.util.LinkedList, and Java type java.util.List<java.lang.String>, and MIME media type application/json was not found
Run Code Online (Sandbox Code Playgroud)
然后我为List编写了一个包装器StringList
@XmlRootElement
public class StringList {
private List<String> data;
public StringList() {
}
public StringList(List<String> data) {
this.data = data;
}
public List<String> getData() {
return data;
}
public void setData(List<String> data) {
this.data = data;
}
}
Run Code Online (Sandbox Code Playgroud)
并修改了立面
@GET
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
@Path("/foo")
public StringList …Run Code Online (Sandbox Code Playgroud) 阅读RESTful文档,似乎没有可能实现异步实例,但有人可能在SO上更好地了解.
我的意思是我想异步执行服务请求:
@Path("/helloworld", asyncSupported=true)
public class MyHelloWorldService {
...
}
Run Code Online (Sandbox Code Playgroud)
我知道asyncSupported没有定义@Path,但我正在寻找类似的东西@WebServlet.然后,我想使用AsyncContext实例(或任何等效的).
这可能吗?
对不起这个生硬的问题.但是很多人日复一日地使用这两个术语但我不知道.我做了一些关于这个的研究并且知道它是分开的.但不明白它是如何相关的.我将首先分享我对这两个的理解.
JAXB是XML-to-Java绑定技术,支持模式和Java对象之间以及XML实例文档和Java对象实例之间的转换.在内部,JAXB在xml和java之间进行所有这些转换.这是xml的解析器,然后它知道xml中的哪个组件对应于java中的内容并且它会中断.从JAXB转换此答案是通过xjc(或codgen插件)等工具完成的.映射可能就像
xsd:string java.lang.String
xsd:integer java.math.BigInteger
JaxRs与众不同.这是处理请求的一组规范.意思是它说"GET("/ foo")"意味着用url/foo处理一个get调用.它只说明了这一点.怎么做的?是的,这称为此规范的实现.有许多实现,如restlet,resteasy,jersey,apache cxf等.这类似于逻辑和你在数学中实现的方式.算法的想法是桶搜索.这可以以任何方式实现.在Java术语中,JaxRs是接口,这4个restlet,resteasy,jersey,apache cxf是接口的实现.
现在请说出我的理解是否正确.然后告诉他们如何相关.请帮忙 .如果可能,图片说明将更有帮助.
您能否解释一下我如何ServletContext在我Application的子类中获取实例?可能吗?我试图像在下面的代码片段中那样做,但它似乎不起作用 - ctx没有设置:
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
//...
@ApplicationPath("/")
public class MainApplication extends Application {
@Context ServletContext ctx;
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> classes = new HashSet<Class<?>>();
//...
return classes;
}
}
Run Code Online (Sandbox Code Playgroud)
web.xml中:
<web-app ...>
<context-param>
<param-name>environment</param-name>
<param-value>development</param-value>
</context-param>
<filter>
<filter-name>jersey-filter</filter-name>
<filter-class>org.glassfish.jersey.servlet.ServletContainer</filter-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>my.MainApplication</param-value>
</init-param>
</filter>
...
</web-app>
Run Code Online (Sandbox Code Playgroud)
问题是我需要从中获取上下文参数.如果有另一种方式,如果有人提示,我将不胜感激.
我知道Context注释可能不适用于此.实际上,我不需要ServletContext自己.如果我只能从web.xml获取上下文参数,我会非常高兴.
这是我真正需要的一个例子:
import java.util.HashSet;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.Context;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
public class MainApplication extends Application { …Run Code Online (Sandbox Code Playgroud) 如何强制URIBuilder.path(...)编码参数如"%AD"?
的方法path,replacePath和segment的URIBuilder并不总是编码参数与百分比,正确.
当参数包含字符"%"后跟两个字符一起形成URL编码字符时,"%"不会编码为"%25".
例如
URI uri = UriBuilder.fromUri("https://dummy.com").queryParam("param", "%AD");
String test = uri.build().toString();
Run Code Online (Sandbox Code Playgroud)
"test"是" https://dummy.com?param=%AD "
但它应该是" https://dummy.com?param=%25AD "(字符"%"编码为"%25")
UriBuilderImpl.queryParam(...)当"%"后面的两个字符是十六进制时,该方法的行为与此类似.即,方法"com.sun.jersey.api.uri.UriComponent.isHexCharacter(char)"对于"%"之后的字符返回true.
我认为UriBuilderImpl的行为是正确的,因为我猜它试图不编码已编码的参数.但在我的场景中,我永远不会尝试使用已经编码的参数创建URL.
我该怎么办?
我的Web应用程序使用新泽西州,在许多地方我建立一个使用类UriBuilder的URI或调用该方法getBaseUriBuilder的UriInfo对象.
每次调用方法时queryParam,我都可以用"%25"替换"%" ,replaceQueryParam或者segment.但我正在寻找一个不那么麻烦的解决方案.
如何让Jersey返回我自己的UriBuilder实现?
我想过创建一个扩展UriBuilderImpl的类来覆盖这些方法,并在调用之前执行此替换super.queryParam(...)或其他任何操作.
在调用UriBuilder.fromURL(...)UriInfo.getBaseUriBuilder(...)等时,有没有办法让Jersey返回我自己的UriBuilder而不是UriBuilderImpl ?
看看这个方法RuntimeDelegate,我想到了扩展RuntimeDelegateImpl.我的实现将覆盖该方法createUriBuilder(...),该方法将返回我自己的方法UriBuilder,而不是UriBuilderImpl.然后,我会添加文件,META-INF/services/javax.ws.rs.ext.RuntimeDelegate并在其中,我的完整的类名称RuntimeDelegateImpl.
问题是jersey-bundle.jar已包含META-INF/services/javax.ws.rs.ext.RuntimeDelegate指向的内容com.sun.jersey.server.impl.provider.RuntimeDelegateImpl,因此容器加载该文件而不是my javax.ws.rs.ext.RuntimeDelegate.因此,它不会加载我的RuntimeDelegate实现. …
我有一个RESTful API,他的文档说某个查询参数是可选的,并且不提供默认参数.因此,我可以提供值,也可以不在GET请求中将其作为参数发送.
例:
queryA 是必须的queryB是可选的(GET没有它可以发送)这应该工作:
http://www.example.com/service/endpoint?queryA=foo&queryB=bar
Run Code Online (Sandbox Code Playgroud)
这应该也有效:
http://www.example.com/service/endpoint?queryA=foo
Run Code Online (Sandbox Code Playgroud)
如何为Jersey-Proxy创建一个可以执行此操作的客户端界面?我没有与服务器端代码进行交互,因此我使用org.glassfish.jersey.client.proxy.WebResourceFactoryJersey-Proxy来生成客户端以与服务器API进行交互.
样本界面:
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
@Path("/service")
@Produces("application/json")
public interface ServiceInterface {
@Path("/endpoint")
@GET
public Response getEndpoint(
@QueryParam("queryA") String first,
@QueryParam("queryB") String second);
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以制作另一种方法:
@Path("/endpoint")
@GET
public Response getEndpoint(
@QueryParam("queryA") String first);
Run Code Online (Sandbox Code Playgroud)
但是当你有多个可选字段时会发生什么?我不想让它们发生任何可能的变异!
到目前为止,我正在通过以下方式返回html我的主页:
@GET
@Produces({MediaType.TEXT_HTML})
public String viewHome()
{
return "<html>...</html>";
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是返回home.html本身而不是复制其内容并返回字符串.
我该怎么做呢?谢谢 :)
我正在使用jersey框架来开发RESTful Web服务.我使用以下代码抛出各种HTTP状态代码和响应:
public class RestNoContentException extends WebApplicationException
{
public RestNoContentException(String message)
{
super(Response.status(Status.NO_CONTENT)
.entity(message).type("text/plain")
.build());
}
}
Run Code Online (Sandbox Code Playgroud)
在使用Firefox Mozilla rest客户端工具测试REST Web服务时,它显示200 OK状态而不是204 NO CONTENT.我正在处理其他状态代码,就像我为状态代码做的那样204.其他状态代码正在rest客户端工具上正确显示204,但何时显示状态代码,它显示200 OK状态代码.
有人可以帮帮我吗?我错过了什么?
我REST-Jersey在我的项目中使用.所有POST数据都以JSON格式发送,并在服务器端解组为相应的bean.像这样的东西:
向服务器发送请求:
$('a#sayHelloPost').click(function(event){
event.preventDefault();
var mangaData = {
title:'Bleach',
author:'Kubo Tite'
}
var formData=JSON.stringify(mangaData);
console.log(formData);
$.ajax({
url:'rest/cred/sayposthello',
type: 'POST',
data: formData,
dataType: 'json',
contentType:'application/json'
})
});
Run Code Online (Sandbox Code Playgroud)
有效载荷:
{"title":"Bleach","author":"Kubo Tite"}
Run Code Online (Sandbox Code Playgroud)
服务器端:
@POST
@Path("/sayposthello")
@Produces(MediaType.APPLICATION_JSON)
public Response sayPostHello(MangaBean mb){
System.out.println(mb);
return Response.status(200).build();
}
Run Code Online (Sandbox Code Playgroud)
MangaBean:
public class MangaBean {
private String title;
private String author;
@Override
public String toString() {
return "MangaBean [title=" + title + ", author=" + author + "]";
}
public String getTitle() {
return title; …Run Code Online (Sandbox Code Playgroud) jax-rs ×10
java ×8
jersey ×6
rest ×5
resteasy ×2
web-services ×2
asynchronous ×1
html ×1
java-ee ×1
jaxb ×1
jersey-1.0 ×1
restlet ×1
xml-binding ×1