1

我有 Spring Web Services 项目,我可以在其中访问登录的用户名。

然后,这些过程通过几个类进行,但我想做的是,当我第一次在第一类中收到用户名时,将用户名设置在用户类/bean 中。

即以下:

我的第一个网络服务课程:

    // Set the Spring Security Name of the user
    user.setSpringSecurityUsername(request.getUserId());
    String springSecurityUsername = user.getSpringSecurityUsername();

我的用户类

private String springSecurityUsername = "";
private final String windowsUsername = System.getProperty("user.name");

public String getSpringSecurityUsername() {
    return springSecurityUsername;
}

public void setSpringSecurityUsername(String springSecurityUsername) {
    this.springSecurityUsername = springSecurityUsername;
}

public String getWindowsUsername() {
    return windowsUsername;
}

我希望能够创建 User bean 的新实例并设置SpringSecurityUsername. 然后我希望将用户对象传递给其他处理类,但我不希望他们能够访问用户中的 setter 方法(例如,不希望其他类能够使用.setSpringSecurityUsername.

我只希望能够设置一次。

有人能帮忙吗?

4

7 回答 7

5

我只希望能够设置一次。

听起来你应该将它传递给构造函数。在某些情况下,您将类称为 bean - 它是否必须是具有无参数构造函数的严格 JavaBean?或者如果你只添加一个构造函数,一切都应该为你工作吗?

将其放入构造函数而不是忽略/抛出第二次setSpringUsername调用的好处是您根本无法表达不正确的代码。让事情变得不可能总是比告诉人们不要去做要好:)

(这也意味着您也可以将其设为 final 字段。)

于 2013-01-07T21:48:08.167 回答
3

听起来初始化值应该只是一个构造函数参数,根本不应该有 setter 方法。在这种情况下,从不调用 setter 也是有效的,包括一个不带参数的构造函数和一个带参数的构造函数。

于 2013-01-07T21:48:08.380 回答
1

用一些值在内部初始化它,然后在你的设置器中检查它是否仍然具有该值。如果是,请允许设置。如果不是,它已经被设置了——在这种情况下什么也不做。

于 2013-01-07T21:47:22.733 回答
1

您不能阻止该方法被调用,但您可以检查它之前是否被调用过:

boolean usernameSet = false;

public synchronized void setSpringSecurityUsername(String springSecurityUsername) {
    if (!usernameSet) {
        this.springSecurityUsername = springSecurityUsername;
        usernameSet = true;
    }
}
于 2013-01-07T21:48:44.250 回答
0

这实际上是构建器模式的要求。你让每个 setter 返回“this”,当你想完成它时,你调用一个像“finish”这样的方法来禁用所有的 setter。像这样:

新的 MyClass()
   .setAge(20)
   .setWeight(200)
   .setHeight(6.0)
   。结束();

根本不是一个坏模式,它为您提供了 java 的命名参数,而不会失去不变性的优势。

于 2013-01-07T21:50:54.620 回答
0

我会说在构造函数中设置它而不是设置方法。

public User(String userName){
    this.springSecurityUsername = userName;
}
于 2013-01-07T21:53:02.867 回答
0

这是一些允许设置一次的代码:

private Object v;

public void setV(Object o) {
    if (v == null) 
        v = o;
}

或者,如果 null 是第一组的可能值 z,请执行以下操作:

private Object notSer = new Object();
private Object v = notSer;

public void setV(Object o) {
    if (v == notSer) 
        v = o;
}
于 2013-01-07T22:00:45.750 回答