web-dev-qa-db-ja.com

ジャージー2.6ジャクソンプロバイダー登録

REST WebサービスをJersey2.6で実装しています。

JSONサポート用にJacksonプロバイダーを登録するのに問題があります。jeresyのドキュメントに従って実装しました( https://jersey.Java.net/documentation/2.6/user-guide.html#json.jackson )。

  1. Mavenの依存関係を追加します-jersey-media-json-jackson
  2. ContextResolverクラスを実装しました。
  3. 「自動検出可能な機能」を有効にするために@Providerで注釈を付けました
  4. web.xmlにはプロバイダークラスのパッケージ名があるため、スキャン中にプロバイダーが登録されます。

参照: http://blog.dejavu.sk/2013/11/19/registering-resources-and-providers-in-jersey-2/

何らかの理由でJackson JSONプロバイダーが登録されていません。何か不足していますか?

13

Jersey 2.9までは、その機能は自動検出されませんでした。 (1)JacksonFeatureApplication/ResourceConfigサブクラスに明示的に登録するか、(2)スキャンするパッケージのweb.xmlにJacksonパッケージをリストするか、(3)JacksonFeatureをに追加する必要があります。 web.xml内のプロバイダーのリスト

アプリケーションサブクラス:

public class MyApplication extends ResourceConfig {  
    public MyApplication() {
        // (1)
        register(JacksonFeature.class); // <----- Jackson Support
        packages("the.package.of.your.resources");
    }
}

またはweb.xml:

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>
        org.glassfish.jersey.servlet.ServletContainer
    </servlet-class>
    <init-param>
        <!-- (2) -->
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>
            the.package.of.your.resources,
            org.codehaus.jackson.jaxrs <!-- Jackson providers -->
        </param-value>
    </init-param>
    <init-param>
        <!-- (3) -->
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>
            org.glassfish.jersey.jackson.JacksonFeature
        </param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

詳細を見る ここの「第2号」...classnamesプロパティの場合、登録するプロバイダーが複数ある場合は、同じparam-valueにコンマ、セミコロン、または改行で区切ってリストする必要があります。

ああ、参考までに、ContextResolverObjectMapperを取得可能なコンテキストに登録するだけなので、MessageBodyReader/MessageBodyWritersはそれを再利用できます。ただし、マーシャリング/アンマーシャリングに必要な実際のMessageBodyReader/Writerは登録されません。

13
Paul Samsotha

こんにちは私は上記が良い解決策だとは思いません。ジャージスプリングブーツジャクソンを提供しなければならないという同じ問題に直面したので。

上記のJacksonFeature.classは、将来のSpringbootアプリケーションで問題となる機能が少ないglassfishからのものです。

  public class MyApplication extends ResourceConfig {  
     public MyApplication() {
    // (1)
    register(ObjectMapperContextResolver.class); // <----- Jackson Support
    packages("the.package.of.your.resources");
}
}


import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.springframework.beans.factory.annotation.Autowired;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {

private final ObjectMapper mapper;

public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}

@Override
public ObjectMapper getContext(Class<?> type) {
return mapper;
}

}

重要な点は、ObjectMapperをcom.fasterxml.jackson.databind.ObjectMapperとしてインポートする必要があることです。最新のスプリングブーツジャクソンのために