所以我编写了一个示例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>
答案 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。