Я пытаюсь использовать аннотацию @InitBind для отображения только определенных полей объекта в теле запроса.Spring @InitBinder on @RequestBody
У меня есть контроллер пружины, определенный таким образом:
@RequestMapping(value = "addAddress", method = RequestMethod.POST)
public Object addAddressToPerson(
HttpServletRequest request,
HttpServletResponse res,
@RequestParam(value = "name", required = false) String name,
@RequestParam(value = "surname", required = false) String surname,
@RequestBody personDTO personJson,BindingResult result) {
Клиентский запрос будет аа JSON, представляющий personDTO, но я не хочу, чтобы поле, кроме адреса, которые будут отображаться в объекте для причины безопасности.
вход будет что-то вроде:
{ "address":"123 Street","........}
personDTO содержит много полеев, и с весной карты все из них непосредственно в DTO, что может быть проблемой.
Я видел, что решение заключается в использовании связующего, чтобы объявить поле разрешенное или запрещенное, но если я проверю personDTO внутри контроллера, будут заполнены другие поля (например, если pass «id»: «1234»,).
Любые Подсказки?
Связующее код выглядит следующим образом:
@InitBinder("orderJson")
protected void orderJsonBinder(WebDataBinder binder){
binder.setAllowedFields(new String[]{"address"});
}
Я пропускаю что-то?
С наилучшими пожеланиями,
Luca.
Спасибо, Серж. В соответствии с вашей подсказкой мне нужно написать пользовательский ObjectMapper для jackson (в моей пружине приложения используйте аннотацию JsonSerialize для класса, поэтому в контроллере json автоматически преобразуется в объект Java. Проблема в том, что для одного и того же класса аннотируется с JsonSerialize, мне нужно другое поведение для другого метода (например, в addAddress мне нужно только поле адреса, может быть, на карте addCredit я закрою только поле creditCart. Вы знаете, как я могу написать собственный ObjectMapper для другого Controller/RequestMapping ? – LFilips