2015-07-28 4 views
3

Я пытаюсь использовать аннотацию @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.

ответ

2

Но вы являетесь не параметрами запроса привязки к атрибуту компонента модели, вы просто просите весну использовать соответствующий MessageConverter для преобразования тела запроса. Как вы говорите, это Json, вы будете использовать MappingJackson2HttpMessageConverter (или MappingJacksonHttpMessageConverter с Jackson 1.x). Справочное руководство по пружине говорит для этого преобразователя:

[Это] реализация HttpMessageConverter, которая может читать и писать JSON с использованием ObjectMapper от Jackson. Картирование JSON может быть настроено по мере необходимости посредством использования аннотаций Джексона. Когда требуется дополнительный контроль, пользовательский ObjectMapper может быть введен через свойство ObjectMapper для случаев, когда для определенных типов должны быть предусмотрены специализированные сериализаторы/десериализаторы JSON. По умолчанию этот конвертер поддерживает (application/json).

@InitBinder может настраивать привязку только для @ModelAttribute аннотированных параметров. Здесь бесполезно. Если аннотаций Джексона недостаточно, вам придется использовать настраиваемый сопоставитель объектов.

И я удивлен, что вы можете использовать BindingResult после параметра @RequestBody, потому что в документации говорится, что он должен следовать за @ModelAttribute.

+0

Спасибо, Серж. В соответствии с вашей подсказкой мне нужно написать пользовательский ObjectMapper для jackson (в моей пружине приложения используйте аннотацию JsonSerialize для класса, поэтому в контроллере json автоматически преобразуется в объект Java. Проблема в том, что для одного и того же класса аннотируется с JsonSerialize, мне нужно другое поведение для другого метода (например, в addAddress мне нужно только поле адреса, может быть, на карте addCredit я закрою только поле creditCart. Вы знаете, как я могу написать собственный ObjectMapper для другого Controller/RequestMapping ? – LFilips