3

そこで、Jersey/Tomcat で魅力的なように機能するサンプル REST リソースを作成しましたが、RestEASY/Tomcat に持っていくとうまくいきません。本当ですか?すぐに使える作業に何が起こったのか。とにかくちょっとがっかり。リソース ( http://localhost:7070/mg/mytest )にアクセスしようとすると、このエラーが発生します。

「コンテンツ タイプが null で、ボディを抽出することを期待していました」

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( 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>
4

5 に答える 5

4

この典型的な原因は、次のようなコードがある場合です。

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

...そして、@PathParam で bar 引数に注釈を付けるのを忘れています。次に、RestEasy は、URL パスからではなく、リクエストの本文からバーを読み取る必要があると判断し、この例外をチャックします。

あなたの場合はそうではないようですが、同じ例外が発生しました。これが原因でした。

于 2010-09-28T17:08:20.957 に答える
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 のせいにするのは早すぎると思います。

于 2010-06-22T03:00:03.453 に答える
1

RestEASY vsジャージーは言うのが難しい:http: //www.infoq.com/news/2008/10/jaxrs-comparison

エラーに関しては、アノテーションを介してコンテンツタイプを制御できます。たとえば、@Producesアノテーションを配置するとどうなりますか。

@Produces("application/json")
@GET
public Response getData() {
  ...
}
于 2010-06-22T03:44:33.663 に答える
1

これが要求されたものは時代遅れであり、インターネット上では古いものであることは知っています.. 2年で、通常、すべてが変化し、より良く機能します. そのため、RestEasy は、他の非プロパーの RESTLET フレームワークと比較して悪い評判を得るべきではありません。

実際、JBoss RestEasy はフットプリントが最も軽く、不要な *.jar で肥大化せず、柔軟性があり、完全に認定された JAX-RS 実装であり、完全であり、その使いやすさは比較にならないほどだと思います。

GET リクエストはリクエストに Content_Type を期待すべきではないという人もいますが (私も同意します)、すべての GET リクエストでは、リクエスタに送り返す意図を示す必要がありますか? 右!(JSON、XML、プレーンテキスト、XML、シートシート、マルチパートなど)。さて、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());  
}   
于 2012-02-28T17:01:56.057 に答える
-1

GET リクエストに body が含まれていてはならず、アプリケーションが Content-Type ヘッダーを予期してはなりません。

もしこれが RestEASY のバグだとしたら、実際にどれだけの人がこのソフトウェアを使っているのだろうか。

編集

RFC2616 $4.3

リクエスト メソッドの仕様 (セクション 5.1.1) でエンティティ ボディの送信が許可されていない場合、リクエストにメッセージ ボディを含めてはなりません (MUST NOT)。

サーバーは、任意の要求でメッセージ本文を読み取って転送する必要があります。リクエストメソッドにエンティティボディの定義されたセマンティクスが含まれていない場合、リクエストを処理するときにメッセージボディを無視する必要があります。

GET メソッドは「リクエストでエンティティ ボディを送信することを許可しない」ため、GET リクエストはボディを持つことができます。ただし、GETには「エンティティ本体の定義されたセマンティクスが含まれていない」ため、いずれにしても本体は無視する必要があります。

いずれにせよ、RestEASY は GET リクエストで Content-Type の存在を要求すべきではありませんでした。

于 2010-06-22T05:04:57.240 に答える