4

我有一个类,我正在使用 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"])

我读过这篇文章,事实证明我可以通过在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

4 回答 4

8

您需要通过JacksonJsonProvider为 Jersey实例化和配置 来配置它Client

泽西 V2.x:

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

client.register(jacksonJsonProvider);

泽西 V1.x:

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

值得注意的是,根本问题是您的 JSON 包含“空”字段......我假设它到达那里是因为您正在序列化同一个 POJO。isEmpty()如果您实际上不希望它在 JSON 中更好,是否不会注释该方法以被忽略以进行序列化?

于 2014-01-30T17:34:13.957 回答
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);

干杯!

于 2015-11-10T07:48:41.690 回答
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

于 2016-07-26T13:26:02.253 回答
-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);        
于 2015-06-10T20:29:56.867 回答