Как отключить определенное поле с помощью Databinder в Spring

#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.