Spring 5 不可变形式在没有参数构造函数时也使用全参数构造函数

在一个不可变的类/对象中,我有一个没有参数的构造函数将值初始化为默认值/null,另一个必需的参数构造函数将所有值初始化为构造函数的参数。


使用表单绑定时(通过在控制器中的请求参数中指定),spring 始终调用无参数构造函数而不初始化值。我怎样才能确保 spring 只调用所需的参数构造函数?


这是在 spring 版本 5.1.5 中。我也尝试在“必需的参数构造函数”上添加 @ConstructorProperties,但无济于事。


我的不可变表单/bean 对象:


public class ImmutableObj {

    private final Integer id;

    private final String name;


    // no arg constructor

    // spring calls this one when resolving request params

    public ImmutableObj() {

        this(null, null);

    }


    // required args constructor

    // I want spring to call this one when resolving request params

    @ConstructorProperies({"id", "name"})

    public ImmutableObj(Integer id, String name) {

        this.id = id;

        this.name = name;

    }


    public Integer getId() {

        return id;

    }


    public String getName() {

        return name;

    }

}

还有我的控制器:


@Controller

public class MyController {

    @GetMapping("myStuff")

    public String getMyStuff(ImmutableObj requestParams) {

        // here the value of request params

        // has nulls due to no arg constructor being called 

        return "someStuff";

    }

}

调用“/myStuff?id=123&name=hello”时


预期的 -requestParams.getId()=123, requestParams.getName()=hello


实际的 -requestParams.getId()=null, requestParams.getName()=null


米琪卡哇伊
浏览 112回答 1
1回答

HUH函数

Spring 总是调用无参数构造函数而不是初始化值。当 Spring 发现该类有多个构造函数时,它会去寻找一个无参数的构造函数。如果 Spring 没有找到它,它将抛出异常。当 Spring 发现该类只有一个构造函数时,它会接受它,而不管它有多少个参数。我怎样才能确保 spring 只调用所需的参数构造函数?唯一的方法是在类中只有一个构造函数。使它在 Spring 中明确无误。作为旁注,@ConstructorProperies({"id", "name"})如果字段名称对应于 URL 参数名称,则不需要。Spring 可以解决这个问题。public&nbsp;ImmutableObj()&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;this(null,&nbsp;null); }这不是一个好主意。ImmutableObj.empty()会更好。作为奖励,如果你想看看幕后发生了什么,这是我正在谈论的片段if (ctor == null) {&nbsp; Constructor<?>[] ctors = clazz.getConstructors();&nbsp; if (ctors.length == 1) {&nbsp; &nbsp; ctor = ctors[0];&nbsp; } else {&nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; ctor = clazz.getDeclaredConstructor();&nbsp; &nbsp; } catch (NoSuchMethodException var10) {&nbsp; &nbsp; &nbsp; throw new IllegalStateException("No primary or default constructor found for " + clazz, var10);&nbsp; &nbsp; }&nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java