1

インジェクションクラスで問題が発生しました。

私の構成では、ログインのレベルを設定する1つのクラスと、レベルを設定するための1つの変数があります。

  <bean id="config" class="..." init-method="init">   
        <property name="log4jConfig" ref="log4j" />
        <property name="levelLogging" value="9" />
    </bean>

そしてコード:

public void setlevelLogging(Integer level) {

    if (level == null) {
        set0();
    } else {
        switch (level) {
        case 0:
            set0();
            break;
        case 9:
            set9();
        }
    }
    this.level = level;

}

private void set0() {
    log4jConfig.setLoggerLevel("org.springframework.ws.server.MessageTracing", "OFF");
    log4jConfig.setLoggerLevel("org.app", "INFO");
    log4jConfig.setLoggerLevel("org.springframework.ws.client.MessageTracing", "OFF");
}    

public void setLog4jConfig(Log4jConfigJmx log4jConfig) {
    this.log4jConfig = log4jConfig;
}

このコードを実行したいとき、setlevelLogging呼び出し時に log4jConfig が null であるため、NPE を取得しました。

この例外を解決するにはどうすればよいですか?

ここで、このクラスをプロパティから除外し、configClass で新しいクラスを作成します。

Log4jConfigJmx log4jConfig = new Log4jConfigJmx()

しかし、私はこれが良い考えだとは思わない

編集:

以下の例を試してみましたが、まだ問題があります。

最初に私はこの例外を得ました:

[ERROR] java.lang.IllegalArgumentException: Superclass has no null constructors but no arguments were given

私はトランザクションと AOP を使用しているため、デフォルトのコンストラクターをクラスに追加して、2 つ持っています。

    public Config() {
    }

    public Config(Log4jConfigJmx log4jConfig, Integer level) {
this.log4jConfig = log4jConfig;
setlevelLoggin(level);
    }

setlevelLogging ...

 <bean id="config" class="..." init-method="init">   
      <constructor-arg index="0" ref="log4j" />
      <constructor-arg index="1" value="9" />
 </bean>

しかし今、私はまだNPEを持っています

助けてください

4

2 に答える 2

1

メソッドのコードをsetLoggingLevelinitメソッドに配置する必要があります。

そのままにしておくだけthis.level = levelで、普通のセッターになります。

initメソッドは、すべてのプロパティが設定された後に呼び出されます。

----コメント後に編集----

コメントした後、コンストラクターを使用することをお勧めします。

public Class(Integer level, Log4jConfigJmx log4jConfig){
   this.log4jConfig = log4jConfig;
   setLevelLogging(level);
}

<bean id="config" class="..." init-method="init"> 
   <constructor-arg index="0" value="9"/>
   <constructor-arg index="1" ref="log4j"/>
</bean>
于 2013-02-25T08:22:03.850 に答える
0

次のようにコンストラクター引数を使用できます。

<bean id="config" class="..." init-method="init">   
    <constructor-arg><ref bean="anotherExampleBean"/></constructor-arg>
    <constructor-arg type="int"><value>9</value></constructor-arg>
</bean>

その後、コンストラクターは、setter メソッドを適切に維持しながら、両方の変数を初期化できます。

例えば

public MyClass(Log4jConfigJmx log4jConfig, Integer level) {
    this.log4jConfig = log4jConfig;
    this.setLevelLogging(level);
}

log4jConfig の作成を試すこともできますautowired

Bean 構成を次のように変更します。

<bean id="config" class="..." init-method="init">   
    <property name="levelLogging" value="9" />
</bean>

次に、クラス内のフィールドにアノテーションを付けて、オートワイヤーします。

@Autowired
private Log4jConfigJmx log4jConfig;

これをスプリング コンテキストの先頭に追加して、注釈を有効にします。

<context:annotation-config />
于 2013-02-25T09:08:10.180 に答える