2016-10-29 3 views
1

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

Я использую Джерси вместе с Джексоном для REST веб-сервиса (JAVA 1.8_011 + Tomcat v7.0 + окна 7 + ДЖЕРСИ-общий 2.23.2 + ДЖЕКСОН 2.8.2)

Один из моих POJO поля имеет следующий сеттер:

public void setEndDate(LocalDateTime endDate) { 
    if (this.startDate != null && this.startDate.isAfter(endDate)) 
    { 
     throw new IllegalArgumentException("Start date must to be before End date"); 
    } 
    this.endDate = endDate; 
} 

мой веб-сервис является следующее:

@PUT 
@Path("/updateCoupon") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.TEXT_PLAIN) 
public String updateCoupon(Coupon coupon) { 

    try 
    { 
     //Coupon tmpCoupon = new Coupon(coupon); 
     System.out.println("*" + coupon.getEndDate().toString() + "*"); 
     getFacade().updateCoupon(coupon); 
     return "ok"; 
    } 
    catch (FacadeException | IllegalArgumentException e) 
    { 
     return e.getMessage(); 
    } 

} 

JSON:

{ 
    "startDate":"2016-11-04T00:00", 
    "endDate":"2016-11-09T00:00", 
    "amount":7, 
    "id":143, 
    "image":"390_290_5cc10a4d-9a3f-4cfc-8.jpg", 
    "message":"gfd", 
    "price":3.34, 
    "title":"n37", 
    "type":"HEALTH" 
} 

После отладки и испытаний проблема заключается в том, что JSON не использует мой сеттер преобразовать из JSON в POJO (это происходит в более сеттеры так сеттер это сам не проблема)

Благодаря

+0

Какое исключение вы получаете, когда вы раскомментируете? – Veeram

+0

throw new IllegalArgumentException («Дата начала должна быть до даты окончания»); –

+1

Что именно вы ожидаете? Какая строка кода выходит из строя? Образец json в вашем сообщении имеет дату начала до даты окончания, поэтому я не понимаю, в чем проблема. – Phil

ответ

1

Ваш текущий код для купона зависит от порядка, в который вызывается сеттер. Если setEndDate вызывается перед setStartDate, проверка в setEndDate не может фактически использовать поле startDate.

Чтобы устранить эту проблему, вы можете:

  • удалить сеттер из вашего компонента и преобразование в инициализации с помощью конструктора, который выполняет логику проверки
  • использовать статический метод фабрики и маркировать его с @JsonCreator, так что Джексон будет использовать это вместо конструктора
  • некоторая комбинация двух вещей выше
  • переключиться на какой-то создатель объекта bean-объекта, который позволяет вам авторизовать метод проверки после того, как все сеттеры были inv (по существу, автоматический вариант второго варианта), например, Immutables или FreeBuilder
+0

Привет, Спасибо за ваш ответ, но это не проблема У меня есть другой сеттер, который не основан на другом поле, и он делает то же самое. Также я использую аннотацию для определения порядка вызова, а также не помог Кроме того, он не входит в сеттер, когда «переводить» с JSON на POJO выполняет JACKSON.Я пробовал аннотацию как @Jsonsetter без успеха –

+0

Является ли сеттер помеченным '@ JsonProperty'? –

+0

Также попробовал, не помог –

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