4

次のように、REST アプリケーションで JSON シリアル化に Jackson を使用します。

import javax.ws.rs.core.Application;

import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.map.SerializationConfig;

public class MyApplication extends Application {

    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(MyResource1.class);
        classes.add(MyResource2.class);
        ...
        return classes;
    }

    public Set<Object> getSingletons() {
        Set<Object> singletons = new HashSet<Object>();
        singletons.add(new JacksonJaxbJsonProvider().configure(
            SerializationConfig.Feature.WRITE_NULL_PROPERTIES, false)); // (*)
        return singletons;
    }

}

(*) それ以外の場合、@XmlElementRef で注釈が付けられたフィールドは、JSON 出力で"myField": null(表示されないのではなく) null のように表示されますが、@XmlElement で注釈が付けられたフィールドでは問題ありません。

ただし、の使用SerializationConfig.Feature.WRITE_NULL_PROPERTIESは推奨されていませんSerializationConfig.setSerializationInclusion(..)(1) それ自体は推奨されていSerializationConfig.withSerializationInclusion(..)ないか、ObjectMapper を介して構成されます(2)

しかし、私が使用していると思うのはnew JacksonJaxbJsonProvider().configure(..)、実際に ObjectMapper を構成することです (コードを調べました)。

したがって、私の質問は次のとおりです。非推奨のプロパティを使用せず、新しい構成クラスを (再) 作成せずに、これを適切に構成するにはどうすればよいですか?

(1) http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/SerializationConfig.Feature.html#WRITE_NULL_PROPERTIES

(2) http://jackson.codehaus.org/1.9.4/javadoc/org/codehaus/jackson/map/SerializationConfig.html#setSerializationInclusion(org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion)

4

1 に答える 1

5

次の構成と OM を使用します。

public class JaxbJacksonObjectMapper extends ObjectMapper {

    public JaxbJacksonObjectMapper() {
        configure(Feature.WRAP_ROOT_VALUE, false); // IMPORTANT must be false
        configure(Feature.WRITE_EMPTY_JSON_ARRAYS, true);
        configure(Feature.WRAP_EXCEPTIONS, true);
        configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

        final AnnotationIntrospector introspector = new JaxbAnnotationIntrospector();

        super.getSerializationConfig().withSerializationInclusion(Inclusion.ALWAYS);
        super.getDeserializationConfig()
                .withAnnotationIntrospector(introspector);
        super.getSerializationConfig()
                .withAnnotationIntrospector(introspector);

    }

}

それが役立つことを願っています

UPD: 申し訳ありませんが、次の部分を忘れていました。また、次のように登録する必要があります。

@Provider
public final class ReContextResolver implements ContextResolver<ObjectMapper> {

    private final ObjectMapper jacksonObjectMapper;

    public ReContextResolver() throws Exception {
        jacksonObjectMapper = new JaxbJacksonObjectMapper();
    }

    @Override
    public ObjectMapper getContext(final Class<?> objectType) {
        return jacksonObjectMapper;
    }

}

私は、POJO マッピングと直接解析を使用しているので、1 つのクラスに組み合わせることができます。

于 2013-02-05T10:23:52.380 に答える