[英]Null content-type when migrating from Jersey to RESTEasy.
所以我編寫了一個示例REST資源,其工作方式類似於Jersey / Tomcat中的一個魅力,但是當我把它帶到RestEASY / Tomcat時,它就會受到打擊。 我的意思是真的嗎 開箱即用的事情發生了什么。 無論如何有點沮喪。 嘗試訪問資源時出現此錯誤( http:// localhost:7070 / mg / mytest )
“content-type為null並期望提取一個body”
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)org.jboss.resteasy.core.MethodInjectorImpl.injectArguments(MethodInjectorImpl.java:98)org.jboss.resteasy.core.MethodInjectorImpl.invoke(在org.jboss.resteasy上的org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.java:247)org.jboss.reste上的org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:212)中的MethodInjectorImpl.java:121) .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>
拋出該異常的代碼如下所示:
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 可能是你代碼的錯。
一個典型的原因是,如果您有這樣的代碼:
@GET
@Path("/foo/{bar}")
@Produces(MediaType.TEXT_HTML)
public Response foo(@PathParam("bar") String bar) {
...而且你忘記用@PathParam注釋bar參數。 然后,RestEasy認為它應該是從請求正文中讀取條形圖,而不是從URL路徑中讀取條形圖,並將查看此異常。
這似乎不是你的情況下發生的事情,但我得到了同樣的例外,這就是原因。
RestEASY vs Jersey很難說: http : //www.infoq.com/news/2008/10/jaxrs-comparison
關於您的錯誤,您可以通過注釋控制內容類型,如果您放置@Produces注釋會發生什么,例如:
@Produces("application/json")
@GET
public Response getData() {
...
}
嗯,我知道這個請求已經過時了,並且在互聯網上有很多舊的......在一年中,一切都經常變化並且效果更好。 因此,與其他非屬性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());
}
GET請求必須沒有正文 ,並且應用程序不得使用Content-Type標頭。
如果這是RestEASY的錯誤,那就讓人懷疑有多少人真的在使用該軟件。
編輯
RFC2616 $ 4.3
如果請求方法的規范(第5.1.1節)不允許在請求中發送實體主體,則消息主體不得包含在請求中。
服務器應該在任何請求上讀取和轉發消息體; 如果請求方法不包含實體主體的定義語義,那么在處理請求時應該忽略消息主體。
GET方法“不允許在請求中發送實體主體”,因此GET請求可能有一個主體。 但是GET “不包括實體主體的定義語義”,因此無論如何都應該忽略主體。
在任何情況下,RestEASY都不應要求在GET請求中存在Content-Type。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.