Как сообщить клиенту Джерси эквивалент @JsonIgnoreProperties (ignoreUnknown = true) для каждого класса, который он десериализует?

У меня есть класс, в котором я использую Джерси-клиент для десериализации. У этого класса есть метод, который выглядит так:

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

Нет сеттера. As-is, это вызовет это исключение:

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).

Проблема заключается в том, что у меня есть много методов, выбрасывающих это исключение. Есть ли способ настроить клиент Джерси, чтобы он действовал так, как будто @JsonIgnoreProperties(ignoreUnknown = true) установлен для каждого класса, поэтому мне не нужно их аннотировать вручную? Я не хочу менять ~ 30 файлов, добавив эту аннотацию вручную. Это предотвратит такие ошибки в будущем, если кто-то добавит геттер без сеттера.

Вот как я создаю своего Джерси-Клиента:

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

Мне кажется, что clientConfig может иметь настройку для этого, но я не уверен, как его найти.

4 ответа

Вам нужно будет настроить это, создав и настроив JacksonJsonProvider для Джерси 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 был лучше?


Принятый ответ от @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);

Ура!


Вы также можете создать свой собственный 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


Используя службу REST на стороне клиента, я столкнулся с той же проблемой. Вот мое исправление:

1) Добавьте com.fasterxml.jackson.jaxrs в свой POM или включите банку в свой проект.

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);

licensed under cc by-sa 3.0 with attribution.