#spring #data-binding
#весна #привязка данных
Вопрос:
Я пытался использовать setDisallowedFields внутри DataBinder, чтобы отключить ассоциацию параметра запроса с моим объектом, но безуспешно.
Вот мой контроллер:
@Controller
@RequestMapping("/home")
public class MyController {
@Autowired
Validator validator;
@InitBinder
public void setAllowedFields(WebDataBinder dataBinder) {
System.out.println(dataBinder.getValidator());
dataBinder.setDisallowedFields("customerId");
}
@RequestMapping(method = POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody Customer home(@Valid @RequestBody Customer customer, final BindingResult bindingResult, Model m) {
System.out.println(StringUtils.join(bindingResult.getSuppressedFields(), ","));
System.out.println(bindingResult.hasErrors());
return customer;
}
}
Мой объект:
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@NotNull
@Size(min = 1, max = 40)
private String firstName;
private String customerId;
// getter and setter not included
}
И мои файлы конфигурации:
WebConfig.java:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages="org.example.controller")
public class WebConfig extends WebMvcConfigurerAdapter {}
WebAppInitializer.java:
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] {WebConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[] {"/"};
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[]{characterEncodingFilter};
}
}
Проверка поля (NotNull, size) хорошо проверена, и установлены ошибки. Но когда я отправляю CustomerID, значение вводится в объект без предупреждения или ошибки.
Есть ли какие-либо дополнительные шаги для реализации этой функции?
Спасибо
Комментарии:
1. Это
DataBinder
работает только для объектов формы, т.Е.@ModelAttributes
. Однако вы используете@RequestBody
, и поэтому привязка данных не используется, и вам придется решить ее в вашем JSON mapper.2. Используете ли вы Jackson в качестве библиотеки JSON?
3. Да, я использую Jackson.