13

RESTEasy を使用して、JSON シリアル化を使用して REST サービスを実装しています。現在、日付は 1970 年からミリ秒単位でシリアル化されています。互換性を向上させるために、日付を 2 つの形式のいずれかに変換したいと考えています。ミリ秒 + タイムゾーン オフセットまたは ISO 8061。

RESTEasy は以前は JSON シリアライゼーションに Jettison を使用していたようですが、私が読んでいたところによると、Jackson に切り替えました ... このすべてが、助けを求めてグーグル検索をかなりヒットまたはミスさせました。

私が知る限り、次の行に沿って ContextResolver を実装する必要があります。

    public class JacksonConfig impelments ContextResolver<ObjectMapper>
    {
        private final OBjectMapper objectMapper;

        public JacksonConfig() throws Exception
        {
            objectMapper = new ObjectMapper.configure(
                               SerializationFeature.WRITE_DATE_AS_TIMESTAMPS, false);
        }

        @Override
        public ObjectMapper getContext(Class<?> arg0)
        {
            return objectMapper;
        }
     }

見つけられなかったのは、これをどうするかということです。どこに置くの?

より大きな問題は、私は正しい方向に向かっているのか、そして私の仮定は正しいのかということです。

4

3 に答える 3

18

ContextResolver実装を Resteasyに登録する必要があります。これを行うには、クラスに@Provider注釈を付けて、Resteasy が起動時に自動的にスキャンできるようにするか、web.xml に登録するか、拡張するクラスに登録しますjavax.ws.rs.core.Application(Resteasy をブートストラップする場合)。

注釈による登録

@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper>
{
    private final ObjectMapper objectMapper;

    public JacksonConfig() throws Exception
    {
        objectMapper = new ObjectMapper.configure(
                           SerializationFeature.WRITE_DATE_AS_TIMESTAMPS, false);
    }

    @Override
    public ObjectMapper getContext(Class<?> arg0)
    {
        return objectMapper;
    }
 }

次のように、web.xml ファイルでクラスパス スキャンが有効になっていることを確認します。

<context-param>
    <param-name>resteasy.scan</param-name>
    <param-value>true</param-value>
</context-param>

注:これを JBoss 7 にデプロイする場合はresteasy.scan、デフォルトで有効になっているため、コンテキスト パラメータを設定しないでください。

web.xml による登録

次のコンテキスト パラメータをファイルに追加しweb.xmlます。パラメータの値は、 の完全修飾クラス名である必要がありますContextResolver

<context-param>
      <param-name>resteasy.providers</param-name>
      <param-value>foo.contextresolver.JacksonConfig</paramvalue>
</context-param> 

アプリケーションによる登録

アプリケーション クラスを使用して Resteasy を構成している場合は、プロバイダを一連のサービスとプロバイダに追加して、次のように Resteasy に登録できます。

public class MyApp extends Application 
{
    @Override
    public Set<Class<?>> getClasses() 
    {
        HashSet<Class<?>> set = new HashSet<Class<?>>(2);
        set.add(JacksonConfig.class);
        set.add(MyService.class);
        return set;
    }
}

スタンドアロン構成の詳細はこちら

于 2013-10-07T20:59:52.773 に答える
6

JSR310 での使用 (新しい API 日付) - LocalDate、LocalDateTime、LocalTime

依存関係を追加:

<dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-jsr310</artifactId> 
     <version>2.4.0</version> 
</dependency>

モジュールを登録するプロバイダーを作成します。

@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper> {
private final ObjectMapper objectMapper;

public JacksonConfig() throws Exception {

    objectMapper = new ObjectMapper()
                .disable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS )
                .disable( SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS )
                .setSerializationInclusion( JsonInclude.Include.NON_NULL )
                .registerModule( new JSR310Module() );

}

@Override
public ObjectMapper getContext( Class<?> arg0 ) {
    return objectMapper;
} }
于 2015-12-23T19:37:46.510 に答える