标签: jax-rs

RESTEasy - 需要完整路径的@Path?

我正在搞乱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前缀...

java jax-rs resteasy

17
推荐指数
1
解决办法
3万
查看次数

泽西岛:返回一个字符串列表

我尝试将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)

java rest jax-rs jersey

17
推荐指数
2
解决办法
4万
查看次数

异步RESTful Web服务是否可行?

阅读RESTful文档,似乎没有可能实现异步实例,但有人可能在SO上更好地了解.

我的意思是我想异步执行服务请求:

@Path("/helloworld", asyncSupported=true)
public class MyHelloWorldService {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我知道asyncSupported没有定义@Path,但我正在寻找类似的东西@WebServlet.然后,我想使用AsyncContext实例(或任何等效的).

这可能吗?

java rest asynchronous web-services jax-rs

17
推荐指数
1
解决办法
3万
查看次数

什么是JAXB和JAXRS?它们有什么关系?

对不起这个生硬的问题.但是很多人日复一日地使用这两个术语但我不知道.我做了一些关于这个的研究并且知道它是分开的.但不明白它是如何相关的.我将首先分享我对这两个的理解.

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是接口的实现.

现在请说出我的理解是否正确.然后告诉他们如何相关.请帮忙 .如果可能,图片说明将更有帮助.

jax-rs jaxb restlet xml-binding resteasy

17
推荐指数
1
解决办法
1万
查看次数

在Application中获取ServletContext

您能否解释一下我如何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)

java jax-rs jersey

17
推荐指数
1
解决办法
2万
查看次数

如何强制URIBuilder.path(...)编码像"%AD"这样的参数?此方法并不总是正确地使用百分比编码参数

如何强制URIBuilder.path(...)编码参数如"%AD"

的方法path,replacePathsegmentURIBuilder并不总是编码参数与百分比,正确.

当参数包含字符"%"后跟两个字符一起形成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或调用该方法getBaseUriBuilderUriInfo对象.

每次调用方法时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实现. …

jax-rs jersey jersey-1.0

17
推荐指数
3
解决办法
3万
查看次数

Jersey Client/JAX-RS和可选(非默认)@QueryParam(客户端)

我有一个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)

但是当你有多个可选字段时会发生什么?我不想让它们发生任何可能的变异!

java rest jax-rs jersey

17
推荐指数
1
解决办法
3万
查看次数

如何使用JAX-RS返回实际的html文件

到目前为止,我正在通过以下方式返回html我的主页:

@GET
@Produces({MediaType.TEXT_HTML})
public String viewHome()
{
   return "<html>...</html>";
}
Run Code Online (Sandbox Code Playgroud)

我想要做的是返回home.html本身而不是复制其内容并返回字符串.

我该怎么做呢?谢谢 :)

html java rest jax-rs java-ee

16
推荐指数
1
解决办法
2万
查看次数

如何在RESTful Web服务中使用jersey框架抛出HTTP 204状态代码?

我正在使用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状态代码.

有人可以帮帮我吗?我错过了什么?

java rest web-services jax-rs jersey

16
推荐指数
3
解决办法
2万
查看次数

如何使用泽西拦截器来获取请求体

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)

java jax-rs jersey

16
推荐指数
2
解决办法
4万
查看次数