从Jersey迁移到RESTEasy时,内容类型为空。

时间:2010-06-22 02:42:10

标签: java tomcat rest resteasy

所以我编写了一个示例REST资源,它的工作方式类似于Jersey / Tomcat中的一个魅力,但是当我把它带到RestEASY / Tomcat时,它就会受到打击。我的意思是真的吗开箱即用的事情发生了什么。无论如何有点沮丧。尝试访问资源(http://localhost:7070/mg/mytest

时出现此错误

“内容类型为空,并期望提取正文”

7842 [http-7070-2]错误com.loyalty.mg.rest.exception.MGExceptionMapper - 异常映射程序中捕获的错误 - org.jboss.resteasy.spi.BadRequestException:content-type为null并期望提取一个正文     在org.jboss.resteasy.core.MessageBodyParameterInjector.inject(MessageBodyParameterInjector.java:131)     at org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:98)     在org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:121)     在org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:247)     在org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:212)     在org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:202)

@Path("/mytest")
public class TestResource  {

    @GET
    public Response getData()

我想这个问题也是 - RestEASY比泽西更好,这只是一个开始,我得到错误。我应该坚持泽西?

也已尝试过这个:)

<context-param>
  <param-name>resteasy.media.type.mappings</param-name>
  <param-value>json : application/json, xml : application/xml</param-value> 
</context-param>

5 个答案:

答案 0 :(得分:4)

抛出该异常的代码如下所示:

     final MediaType mediaType = request.getHttpHeaders().getMediaType();
     if (mediaType == null) {
        throw new BadRequestException(
             "content-type was null and expecting to extract a body");
     }

问题似乎是RestEASY无法从收到的请求的标头中找出内容类型。这表明请求中的内容类型是假的,或者您配置RestEASY的方式存在问题。

  

我想这个问题也是 - RestEASY比泽西更好,这只是一个开始,我得到错误。我应该坚持泽西?

我无法回答这个问题。但是,我认为你太快速责怪RestEASY因为可能是你代码的错误。

答案 1 :(得分:4)

这是一个典型的原因,如果你有这样的代码:

@GET
@Path("/foo/{bar}")
@Produces(MediaType.TEXT_HTML)
public Response foo(@PathParam("bar") String bar) {

...你忘记用@PathParam注释bar参数。然后RestEasy认为它应该是从请求正文中读取条形图,而不是从URL路径中读取条形图,并且会查看此异常。

这似乎不是你的情况,但我得到了同样的例外,这就是原因。

答案 2 :(得分:1)

RestEASY vs Jersey很难说: http://www.infoq.com/news/2008/10/jaxrs-comparison

关于您的错误,您可以通过注释控制内容类型,如果您放置@Produces annotation会发生什么情况,例如:

@Produces("application/json")
@GET
public Response getData() {
  ...
}

答案 3 :(得分:1)

嗯,我知道这个请求已经过时了,而且在互联网上已经过时了......在一年的两年里,一切都经常变化,效果更好。因此,与其他非属性RESTLET框架相比,RestEasy不应该得到糟糕的说唱。

实际上我认为JBoss RestEasy具有最轻的占地面积,它不会因不必要的* .jars,灵活,完全认证的JAX-RS实现而变得臃肿,完整且易于使用,这是无法比拟的。

有些人提到,GET请求不应该在请求中期望Content_Type,(我同意),但是对于每个GET请求,必须指出您打算发送回请求者的内容?对! (它将是JSON,XML,纯文本,XML和工作表,多部分等)。 Well RestEasy,JBoss的框架通过如下所示的注释解决了这个问题,并且可以根据URL REST请求进行配置。 因此,这是您的答案

 @GET 
 @Path("/echo/{message}")  
 @Produces("text/plain")  
 public String echo(@PathParam("message")String message){  
     return message;      
 }  

 @GET 
 @Path("/employees")  
 @Produces("application/xml")  
 @Stylesheet(type="text/css", href="${basepath}foo.xsl")
 public List<Employee> listEmployees(){  
    return new ArrayList<Employee>(employees.values());  
 }  

 @GET 
 @Path("/employee/{employeeid}")  
 @Produces("application/xml")  
 public Employee getEmployee(@PathParam("employeeid")String employeeId){  
     return employees.get(employeeId);          
 }  

 @GET 
 @Path("/json/employees/")  
 **@Produces("application/json")**  
 public List<Employee> listEmployeesJSON(){  
     return new ArrayList<Employee>(employees.values());  
}   

答案 4 :(得分:-1)

GET请求不得拥有正文,并且应用程序不得使用Content-Type标头。

如果这是RestEASY的错误,那就让人怀疑有多少人真正正在使用该软件。

编辑

RFC2616 $ 4.3

  

邮件正文不得包含在内   如果规范的请求   请求方法(第5.1.1节)   不允许发送实体主体   请求。

     

服务器应该读取和转发a   任何请求的消息体;如果   请求方法不包括   为实体主体定义的语义,   然后消息体应该是   在处理请求时被忽略。

GET方法“不允许在请求中发送实体主体”因此GET请求可能有一个正文。但是GET “不包含实体主体的定义语义”因此无论如何都应该忽略正文。

在任何情况下,RestEASY都不应要求GET请求中存在Content-Type。