2013-01-18 16 views
5

JacksonJsonProviderはCXFで動作しません。Jackson JSONがCXFと連携していません

CXF v2.6.0 ジャクソンv2.1.2(com.fasterxml.jackson)(テスト用) RESTClient

私はbeans.xmlの中で以下のように構成されたプロバイダを持っています。 jaxrsで

<bean id="jacksonMapper" class="com.fasterxml.jackson.databind.ObjectMapper"> 
    <property name="dateFormat"> 
    <bean class="java.text.SimpleDateFormat"> 
    <constructor-arg type="java.lang.String" value="yyyy-MM-dd'T'HH:mm:ss.SSSZ">  </constructor-arg> 
    </bean> 
    </property> 
</bean> 

<bean id="jacksonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider"> 
    <property name="mapper" ref="jacksonMapper" /> 
</bean> 

:サーバー.....>

<jaxrs:providers> 
<ref bean="jaxbProvider" /> 
<ref bean="jacksonProvider" />       
</jaxrs:providers> 

</jaxrs:server> 

アプリケーションが問題なくデプロイされる私は「アプリケーション/ XML」などの要求と応答を与える一方で、それは良いJSONを与えます"application/json"とします。

私は要求がCXF-ログスルーログファイルに記録なっている500内部サーバーエラーに

に直面してるのContent-Type =アプリケーション/ JSONを設定することで、要求にJSONを与えることを試みます。

要求は、私のWebサービスのサービス実装クラスにはまったく着いていません。

リクエストボディでJSONは次のとおりです。

{"SearchOrdersRequest":{"LoginCredentials":{"AppId":"BookStore","Username":"myuser","Password":"abcd1234","SecurityToken":"Vcvx45YilzX1"},"SearchHeader":{"SearchCategory":"Rep","FilterLogic":"1 AND 2","SearchParams":{"Field":"Order Number (s)","Operator":"EQUALS","Values":"600045335"}}}} 

どれでも即時のヘルプは高く評価されています。

答えて

0

私はクラスパスにライブラリを捨てていないときに、しばらく前にjsonのリクエストに問題がありました。 http://www.javatips.net/blog/2012/02/cxf-restful-tutorialチュートリアルを確認してください。あなたはJSONプロバイダーを追加し、依存関係を含める必要がどこ

0

投棄をオーバーライドすることによってジャクソンライブラリを使用するためには、あなたがCXF documentation

<bean id="jacksonJsonProvider" class="com.student.CustomJsonProvider"/> 

<jaxrs:providers> 
    <ref bean="jacksonJsonProvider" /> 
</jaxrs:providers> 
3

を次のようにjacksonproviderを設定する必要があり、あなたが見ることができます。しかし、私はジェットシップの代わりにジャックソンを追加しようとしたときにエラーが発生していました。数時間後にもう一つのジャクソンの依存関係が必要だとわかりました。

  1. 私はあなたのアプリケーションは、XMLとJSONフォーマットを生成し、消費し、あなたをundertoodとして

    <dependency> 
        <groupId>org.codehaus.jackson</groupId> 
        <artifactId>jackson-xc</artifactId> 
        <version>1.9.12</version> 
    </dependency> 
    <dependency> 
        <groupId>org.codehaus.jackson</groupId> 
        <artifactId>jackson-jaxrs</artifactId> 
        <version>1.9.12</version> 
    </dependency> 
    
+2

これは2年後でも有効です –

+0

jaxrs:repleace how to pure javaconfig ) –

2

依存関係を追加JSONプロバイダ

<jaxrs:providers> 
    <bean class="org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider" /> 
</jaxrs:providers> 
  • を追加します。だからまず第一にcxfリソースエンドポイントがそれを実行できることを確認します。

    @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) 
    

    そうしないと、リクエストはリソースの実装を見つけることができません。これは十分にこのジャクソンCXF統合チェックアウトされていない場合、

    (クラスレベルまたはメソッドレベルでこれらの行で):また

    <jaxrs:server id="services" address="/"> 
        <jaxrs:providers> 
         <ref bean="jsonProvider" /> 
         <ref bean="jsonContextResolver" /> 
        </jaxrs:providers> 
        </jaxrs:server> 
    

    <bean id="jsonProvider" class="com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider" /> 
    <bean id="jsonContextResolver" class="net.sf.gazpachoquest.rest.support.JacksonContextResolver" /> 
    

    コンテキストクラスレゾルバマッパーは次のように定義されています:

    @Provider 
    public class JacksonContextResolver implements ContextResolver<ObjectMapper> { 
    
        private final ObjectMapper mapper = new ObjectMapper(); 
    
        public JacksonContextResolver() { 
         /* 
         * Register JodaModule to handle Joda DateTime Objects. 
         * https://github.com/FasterXML/jackson-datatype-jsr310 
         */ 
         mapper.registerModule(new JSR310Module()); 
         mapper.setSerializationInclusion(Include.NON_EMPTY); 
         mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 
    
        } 
    
        @Override 
        public ObjectMapper getContext(Class<?> arg0) { 
         return mapper; 
        } 
    } 
    

    そして、あなたのアプリケーションをj2ee contあなたはアプリケーション設定クラスが必要な場合があります:

    @ApplicationPath("/api") 
    public class ApplicationConfig extends javax.ws.rs.core.Application{ 
    
        @Override 
        public Set<Class<?>> getClasses() { 
         Set<Class<?>> classes = new HashSet<Class<?>>(); 
         // add here your resources 
         classes.add(JacksonContextResolver.class); 
         classes.add(JacksonJsonProvider.class); 
         ... 
         return classes; 
        } 
    

    このヘルプが必要です。通常の状況で

  • +0

    私の一日を保存しました!ありがとう:) – L01c

    +0

    NP、あなたは歓迎です –

    0

    あなたは、単に(私は幅TomEE 7をテストした)プロバイダが自動的に検出され、使用されなければならなかったその依存関係を追加することにより、EEサーバーに展開する場合:

    <dependency> 
        <groupId>com.fasterxml.jackson.jaxrs</groupId> 
        <artifactId>jackson-jaxrs-json-provider</artifactId> 
        <version>2.8.6 </version> 
    </dependency> 
    

    しかし、正しいを使用するように注意してくださいバージョン。 CFXガイドでは、ジャクソン1とのみ互換性があり、ジャクソン2では互換性のないジャクソンJAX-RSプロバイダが示唆されています。at that question詳細はこちら

    関連する問題