You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:53:23