Spring Boot 3.3.1中@InitBinder的setDisallowedFields不生效问题
问题原因
你遇到的问题源于Lombok的@Builder注解:Spring的模型属性绑定机制会优先使用Builder来构建TestDTO对象,而WebDataBinder的setDisallowedFields()规则仅对基于Setter或字段直接赋值的绑定生效,无法限制Builder的属性设置方法(比如name()),因此传入的name参数仍然会被绑定到DTO的对应字段。
解决方案
以下是几种可行的解决办法:
方法一:明确指定允许绑定的字段
将setDisallowedFields替换为setAllowedFields,只开放需要绑定的字段(比如id),未被指定的name会自动被忽略:
@InitBinder("NoId") public void initBinder(WebDataBinder binder) { binder.setAllowedFields("id"); }
方法二:切换到Setter/构造器绑定模式
在TestDTO上添加无参构造器和全参构造器(通过Lombok注解实现),让Spring使用Setter或构造器进行属性绑定,此时setDisallowedFields规则会生效:
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class TestDTO implements Serializable { private Integer id; private String name; }
方法三:自定义PropertyEditor强制清空name字段
通过注册自定义PropertyEditor,将传入的name参数强制设为null:
@InitBinder("NoId") public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(String.class, "name", new PropertyEditorSupport() { @Override public void setAsText(String text) { // 忽略传入值,强制设置为null setValue(null); } }); }
内容的提问来源于stack exchange,提问作者McQuack
相关产品推荐
相关产品推荐

