1

ログインしたユーザー名にアクセスできるSpring Web Servicesプロジェクトがあります。

その後、プロセスはいくつかのクラスを介して行われますが、私がやりたいことは、最初のクラスで最初にユーザー名を受け取ったときに、ユーザー クラス/Bean にユーザー名を設定することです。

つまり、次のとおりです。

私の最初の Web サービス クラス:

    // 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. 次に、ユーザーオブジェクトを他の処理クラスに渡したいのですが、ユーザーのセッターメソッドにアクセスできるようにしたくありません(たとえば、他のクラスが.setSpringSecurityUsername.

一度だけ設定できるようにしたいです。

誰でもこれを手伝ってもらえますか?

4

7 に答える 7

5

一度だけ設定できるようにしたいです。

それをコンストラクタに渡す必要があるようです。場合によっては、クラスを Bean と呼んでいますが、パラメーターなしのコンストラクターを持つ厳密な JavaBean である必要がありますか? または、コンストラクターを追加するだけで、すべてが機能するはずですか?

2番目の呼び出しで無視/スローするよりもコンストラクターに入れる利点は、setSpringUsername単に間違ったコードを表現できないことです。人々にそれをしないように言わなければならないよりも、何かを不可能にする方が常に良いです:)

(それはまた、それを final フィールドにすることもできるということです。)

于 2013-01-07T21:48:08.167 に答える
3

初期化値は単なるコンストラクターパラメーターであり、セッターメソッドはまったく存在しないように思えます。セッターを呼び出さないことも有効な場合は、引数のないコンストラクターと引数のあるコンストラクターの両方を含めます。

于 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

一度設定できるようにするコードは次のとおりです。

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 に答える
0

これは実際にはビルダー パターンの要件です。各セッターに「this」を返させ、それをファイナライズしたい場合は、「finish」などのメソッドを呼び出してすべてのセッターを無効にします。次のようになります。

新しい 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 に答える