如何告诉Jersey客户端在它反序列化的每个类上执行等效的@JsonIgnoreProperties(ignoreUnknown = true)?

时间:2014-01-30 16:46:20

标签: java jaxb jackson jersey-client jersey-1.0

我有一个类,我正在使用Jersey客户端进行反序列化。这个类有一个如下所示的方法:

public boolean isEmpty() {
    return (code == null &&
            label == null &&
            codeSystem == null &&
            codeSystemLabel == null &&
            description == null &&
            concept == null &&
            alternateCode == null
    );

没有二传手。原样,这将抛出此异常:

com.sun.jersey.api.client.ClientHandlerException: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "empty" (Class com.app.models.CodedElementModel), not marked as ignorable
 at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@3b927d51; line: 1, column: 270] (through reference chain: com.app.models.LabOrderModel["code"]->com.app.models.CodedElementModel["empty"])

I've read this article,事实证明我可以通过在CodedElementModel类上添加此注释来解决此问题:@JsonIgnoreProperties(ignoreUnknown = true)

问题是我有很多方法抛出这个异常。有没有办法配置Jersey客户端,就像在每个类上设置@JsonIgnoreProperties(ignoreUnknown = true)一样,所以我不必手动注释它们?我不想通过手动添加此注释来更改~30个文件。如果有人在没有setter的情况下添加getter,这将在将来防止此类错误。

以下是我创建Jersey客户端的方法:

    DefaultClientConfig clientConfig = new DefaultClientConfig();
    clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
    Client client = Client.create(clientConfig);

我觉得clientConfig可能有设置来执行此操作,但我不确定如何找到它。

4 个答案:

答案 0 :(得分:8)

您需要通过为泽西JacksonJsonProvider实例化和配置Client来配置此功能。

Jersey V2.x:

JacksonJsonProvider jacksonJsonProvider = 
    new JacksonJaxbJsonProvider()
        .configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

client.register(jacksonJsonProvider);

Jersey V1.x:

DefaultClientConfig clientConfig = new DefaultClientConfig();
JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider().
    configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
clientConfig.getSingletons().add(jacksonJsonProvider);

值得注意的是,潜在的问题是你的JSON包含字段“空”......我假设它已经到了那里,因为你正在序列化相同的POJO。如果您真的不希望它在JSON中更好地注释isEmpty()方法被忽略的序列化会不会更好?

答案 1 :(得分:4)

来自@sleske的接受回复,因为我正在使用com.sun.jersey.api.client.Client和com.fasterxml.jackson.jaxrs.json.JacksonJsonProvider而无法解决这个问题。实际上对我有用的是

ClientConfig config = new DefaultClientConfig();

JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
config.getSingletons().add(jacksonJsonProvider);
Client client = Client.create(config);

干杯!

答案 2 :(得分:1)

您还可以构建自定义ObjectMapper并使用它传递它。

ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
final JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider(mapper, JacksonJaxbJsonProvider.DEFAULT_ANNOTATIONS).configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

final Client    client  = ClientBuilder.newClient().register(jacksonJsonProvider);

使用此maven依赖

    <dependency>
        <groupId>com.fasterxml.jackson.jaxrs</groupId>
        <artifactId>jackson-jaxrs-json-provider</artifactId>
        <version>2.6.6</version>
    </dependency> 
    <dependency>
        <groupId>org.glassfish.jersey.media</groupId>
        <artifactId>jersey-media-json-jackson</artifactId>
        <version>2.22.1</version>
    </dependency> 

如此处https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json

所述

答案 3 :(得分:-1)

在客户端使用REST服务我遇到了同样的问题。这是我的修复:

1)将com.fasterxml.jackson.jaxrs添加到您的POM或将jar包含在您的项目中。

2)修改ClientConfig:

JacksonJsonProvider jacksonJsonProvider = new JacksonJaxbJsonProvider();
jacksonJsonProvider.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);

ClientConfig clientConfig = new DefaultClientConfig();
clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
clientConfig.getClasses().add(jacksonJsonProvider.getClass());

Client client = Client.create(clientConfig);