2016-09-06 18 views
1

私はジャージーを使用して、一般的なREST APIを作るしようとしていますし、私はこのために、以下のブログに続く:だから何が起こっている https://theza.ch/2009/08/11/uri-extensions-in-jersey/URIの拡張子(.xmlの、.json)

をサーバーが動作していることです私のURLに.xmlを使用し、.jsonを使用すると500の内部サーバーエラーが発生します。私は別のものを試しましたが、無駄です。誰かが何らかの変更によって、なぜこれがjsonで起こっているのか、xmlではなく、これを修正する方法を知っていますか?

私のコードは次のようになります。

@GET 
@Path("/order/{product-key}/getorderid") 
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
public Response getOrderIdByDomain(@Context HttpServletRequest request, 
            @PathParam("product-key") final String productKey, 
            @QueryParam("domain-name") final String domainName) throws Exception 
{ 
    try 
    { 
     Integer response = doSomething(); 

     return Response.status(200).entity(response).build(); 
    } 
    catch (Exception lbe) 
    { 
     Hashtable response = new Hashtable(); 
     response.put("Error",lbe.getMessage()); 
     return Response.status(400).entity(response).build(); 
    } 
} 

UPDATE:

ジャージー-jsonの依存関係を追加した後、500エラーは200 OKに変更するが、私はまだ空の応答を取得しています。 xmlの場合、私は期待される応答を得ています。誰かが同様の問題に直面しましたか?私は他の回答からいくつか試してみましたが、それはうまくいかないようですので、何かを提案してください。

のStackTrace:ジャージ・サーバー、ジャージー-JSONバージョン1.8:

Caused by: java.lang.AbstractMethodError 
at org.codehaus.jackson.map.AnnotationIntrospector$Pair.findSerializer(AnnotationIntrospector.java:1148) 
at org.codehaus.jackson.map.ser.BasicSerializerFactory.findSerializerFromAnnotation(BasicSerializerFactory.java:362) 
at org.codehaus.jackson.map.ser.BeanSerializerFactory.createSerializer(BeanSerializerFactory.java:252) 
at org.codehaus.jackson.map.ser.StdSerializerProvider._createUntypedSerializer(StdSerializerProvider.java:782) 
at org.codehaus.jackson.map.ser.StdSerializerProvider._createAndCacheUntypedSerializer(StdSerializerProvider.java:735) 
at org.codehaus.jackson.map.ser.StdSerializerProvider.findValueSerializer(StdSerializerProvider.java:344) 
at org.codehaus.jackson.map.ser.StdSerializerProvider.findTypedValueSerializer(StdSerializerProvider.java:420) 
at org.codehaus.jackson.map.ser.StdSerializerProvider._serializeValue(StdSerializerProvider.java:601) 
at org.codehaus.jackson.map.ser.StdSerializerProvider.serializeValue(StdSerializerProvider.java:256) 
at org.codehaus.jackson.map.ObjectMapper.writeValue(ObjectMapper.java:1606) 
at org.codehaus.jackson.jaxrs.JacksonJsonProvider.writeTo(JacksonJsonProvider.java:520) 
at com.sun.jersey.json.impl.provider.entity.JacksonProviderProxy.writeTo(JacksonProviderProxy.java:160) 
at com.sun.jersey.spi.container.ContainerResponse.write(ContainerResponse.java:306) 
at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1437) 
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) 
at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) 
at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) 
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) 
at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
... 48 more 

私は、次の依存関係を使用しています。

+0

あなたはジャックソンの依存関係が不足していると思われますので、これを参照してプロジェクトに含めてください。http://stackoverflow.com/questions/18429468/correct-set-of-dependencies-for-using-jackson-mapper –

+0

例外スタックトレースを私たちと共有しますか? – Robertiano

+1

そのチュートリアルは今のところ7歳になっていて、古い* Jersey 1.xに基づいています。あなたは何か*新しい*をやっていますか? Jersey 2.xの使用を検討したことがありますか? –

答えて

2

この問題を修正しようとした後、私はgensonに切り替えました。

 <dependency> 
      <groupId>com.owlike</groupId> 
      <artifactId>genson</artifactId> 
      <version>1.3</version> 
     </dependency> 

非常に簡単でした。ジャクソンがうまくいかなかった理由を後で見つけようとします。

0

jarファイルの依存関係を追加した後、次のようにreturn文を変更することにより、あなたはこのように行うことができますので、今、
はあなたが「形式」という名前のXMLやJSONを決定するための追加のパラメータを持っている必要があります、コメントで示唆されているように

@GET 
    @Path("/order/{product-key}/{format}/getorderid") 
    @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) 
    public Response getOrderIdByDomain(@Context HttpServletRequest request, 
             @PathParam("product-key") final String productKey,@PathParam("format") final String format, 
             @QueryParam("domain-name") final String domainName) throws Exception 
    { 
     try 
     { 
      Integer response = doSomething(); 

      return Response 
       // Set the status and Put your entity here. 
       .ok(entity) 
       // Add the Content-Type header to tell Jersey which format it should marshall the entity into. 
       .header(HttpHeaders.CONTENT_TYPE, "json".equals(format) ? MediaType.APPLICATION_JSON : MediaType.APPLICATION_XML) 
       .build(); 
     } 
     catch (Exception lbe) 
     { 
      Hashtable response = new Hashtable(); 
      response.put("Error",lbe.getMessage()); 
      return Response.status(400).entity(response).build(); 
     } 
    } 
+0

私はそれを達成するためにこの方法を知っていますが、私は余分なPathParamと私の質問に投稿したリンクを送信したくないだけでそれを行うと主張します。私は何が間違っているのか理解しようとしています。 – doctore

+0

あなたはあなたが挿入したジャーを私に教えてもらえますし、クライアントからあなたのリクエストコールを入れてもいいですか? –

+0

私は質問の編集でスタックトレースを貼り付けました。 – doctore