2016-10-14 6 views
3

У меня есть DTO с полем типа java.util.Optional, как это:Как карта java.util.Optional с джерси клиента

public class Person { 

private final Optional<Long> id; 

@JsonCreator 
public Person(@JsonProperty("id") Long id) { 
    this.id = id; 
} 

public Optional<Long> id { 
    return this.id 
} 

}

Если я пытаюсь сериализовать в формате JSON и отправить его джерси клиент, сервер выбрасывает исключение ниже:

com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class java.util.Optional<java.lang.Long>] from Integral number (1); no single-int-arg constructor/factory method 

можно использовать java.util.Optional с джерси клиента?

Спасибо.

ответ

3

JSON не содержит необязательный, он содержит длинный, так что вам нужно создать Optional из ряда Long вы получаете:

@JsonCreator 
public Person(@JsonProperty("id") Long id) { 
    this.id = Optional.ofNullable(id); 
} 
+0

Спасибо большое. это решит мою проблему !! – LucaA

1

Добавьте jackson-datatype-jdk8 зависимости к pom.xml:

<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jdk8</artifactId> 
    <version>2.6.3</version> 
</dependency> 

Создание ObjectMapper экземпляра и зарегистрировать Jdk8Module:

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new Jdk8Module()); 

А затем зарегистрировать JacksonJsonProvider в вашем Client Например:

Client client = ClientBuilder.newClient().register(new JacksonJsonProvider(mapper)); 
+0

Мы используем каркас дровиза, он уже сделал эту конфигурацию. Благодарю. – LucaA