2014-01-30 2 views
3

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

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: [email protected]7d51; 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).

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

Вот как я создаю мой клиент Джерси:

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

Я чувствую, что clientConfig может иметь параметр, чтобы сделать это, но я не знаю, как его найти.

ответ

6

Вам необходимо настроить это путем создания и настройки 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 был лучше?

+0

На самом деле я хочу его в формате JSON. Это поле 'empty' будет сохранять людей на разных языках от необходимости писать собственную реализацию' isEmpty() ', как у моих моделей. –

+0

Кстати, этот метод 'register' не существует на моем« Клиенте »(может быть, это вещь джерси-2.0?) Знаете ли вы, как установить это в jersey 1.x? –

+0

@tieTYT Yikes, извините ... Я не видел, что это был Джерси 1.x. Держитесь, к сожалению, немного сложнее; редактирование –

-1

Использование службы 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);   
+1

Это не сработает, и это не имеет смысла. Вы создаете экземпляр 'JacksonJsonProvider', но никогда не используете его, кроме как называть' getClass() 'на нем. – sleske

4

Accepted ответ от @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); 

Cheers!

0

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

Смежные вопросы