簡體   English   中英

從Jersey遷移到RESTEasy時,內容類型為空。

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM