2016-02-03 3 views
0

У меня есть компонент, который не является unmarshalling, но нет сообщения об ошибке - конечная точка вместо этого вызывается с нулевым экземпляром компонента.MOXy unmarshalled bean from @PUT имеет значение null, в зависимости от заказа свойства JSON

Это Джерси 2.22.1, с его поставщиком JAXB по умолчанию (MOXy).

Я воспроизвел проблему с очень простым бобом:

@XmlRootElement 
public class Expense { 
    private BigDecimal units; 
    private BigDecimal unitRate; 

    public BigDecimal getUnits() { 
     return units; 
    } 
    public void setUnits(BigDecimal units) { 
     this.units = units; 
    } 
    public BigDecimal getUnitRate() { 
     return unitRate; 
    } 
    public void setUnitsRate(BigDecimal unitRate) { 
     this.unitRate = unitRate; 
    } 
} 

PUT метод ресурс:

public class ExpenseResource { 
    @PUT 
    @Consumes(MediaType.APPLICATION_JSON) 
    public Response putExpense(Expense e) { 
     if (e == null) { 
      throw new BadRequestException("Failed to marshall expense object"); 
     } 
     return TAEUtil.buildPutResponse(uriInfo, "/expenses/%d", this.expenseID); 
    } 

    //.... 
} 

Когда HTTP PUT отправляется ExpenseResource.putExpense называется, но вся фасоль аргумент часто устанавливается равным null. Я не получаю никаких исключений или зарегистрированных ошибок.

Возможно, это зависит от свойств JSON и их порядка. В частности, в следующем формате JSON делает не маршализацию:

{ "units": null, "unitRate": null } 

Но если поменять местами два свойства, демаршаллизации работы!

{ "unitRate": null, "units": null } 

Тестирование показывает следующее:

  1. Пока unitRate не последнее свойство JSON, Expense unmarshalls правильно.
  2. Если unitRate является конечным свойством, но не имеет значение null, Expense unmarshalls BUT unitRate сам по себе (его значение null). Пример: {"units": 5, "unitRate": 5}

  3. Обратите внимание, что «единицы» также являются BigDecimal, но при последнем, а не в нулевом значении - неправильно. Но я не вижу разницы между этими двумя свойствами.

  4. Добавление фиктивного окончательного имущества не имеет значения.

    { "единицы": 8, "unitRate": нулевой, "ZZZ": ""} // не удается

Несмотря на изоляцию поведение этой одной области у меня нет каких-либо объяснений или обходной путь. Предложения приветствуются!

+0

Обновлено с новой информацией. Проблема JSON, похоже, вызывает проблему. Скорее .. – Bampfer

+0

Мне удалось воспроизвести проблему с гораздо более простым примером, поэтому я переписал вопрос. – Bampfer

ответ

0

Основная причина моей проблемы - опечатка на устройстве для unitRate. Он должен быть «setUnitRate», а не «setUnitsRate».

Как правило, это просто приведет к тому, что unitRate не будет установлен при разборке (как мы видим в тесте № 2 выше). Достаточно просто найти и исправить. Но, похоже, в этой версии MOXy есть ошибка, которая, если последнее свойство JSON не соответствует каким-либо свойствам компонента, AND имеет значение null, MOXy предоставит вам null вместо вашего другого действительного компонента.

{ "units": 1, "someBogusString": null } // fails 

{ "units": 1, "someBogusString": 0 } // succeeds 

Я зарегистрирую его как ошибку EclipseLink, посмотрю, что они думают об этом.

+0

Ошибка здесь: https://bugs.eclipse.org/bugs/show_bug.cgi?id=487176 – Bampfer