2013-02-25 2 views
1

У меня проблема впрыска класса.NPE когда класс впрыска весной

В моей конфигурации у меня есть один класс, который уровень настройки логина и затем один переменный для уровня настройки:

<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; 
} 

, когда я хочу, чтобы запустить этот код, который я получил NPE, потому что log4jConfig имеет значение null, когда вызывается setlevelLogging.

Как я могу решить это исключение?

теперь я исключить этот класс из свойств и создание нового класса в configClass:

Log4jConfigJmx log4jConfig = new Log4jConfigJmx() 

, но я не думаю, что это хорошая идея

EDIT:

Стараюсь пример ниже, но у меня есть еще одна проблема:

сначала я получил это исключение:

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

, потому что я использую транзакционной и АОП, так что я добавить конструктор по умолчанию в классе, так у меня есть два из них:

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

Просьба помочь

+0

Вы можете использовать как конструктор args, так что заказ не изменится. – BobTheBuilder

+0

hm и можно совместить конструктор arg с собственностью? – hudi

+0

Как выглядит ваш класс сейчас и как выглядит ваш весенний xml? Кроме того, вы проверяли с помощью отладки, что переданный log4j не является нулевым? – tom

ответ

1

Вы должны поместить код из метода setLoggingLevel в методе init.

Оставьте только this.level = level, так что это простой сеттер.

Метод init вызывается после того, как все свойства были установлены.

---- EDIT после комментариев ----

После комментариев я предлагаю вам использовать конструктор:

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> 
+0

Я не могу, потому что этот метод виден из jmx, поэтому, когда я хочу изменить параметр log4j динамически, я вызываю этот метод, и когда я помещаю этот метод в init, я теряю эту функцию. – hudi

+0

вопрос обновлен после вашего ответа, пожалуйста, проверьте его, спасибо – hudi

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> 

Тогда ваш конструктор может инициализировать обе переменные, сохраняя при этом методы настройки.

E.g.

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

Вы также можете попробовать сделать в log4jConfig autowired.

Изменение боба конфигурации обратно:

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

А потом просто аннотировать поле в классе, чтобы быть autowired:

@Autowired 
private Log4jConfigJmx log4jConfig; 

Добавьте это в верхней части пружинного контекста, чтобы позволить аннотаций :

<context:annotation-config /> 
+0

hm и можно совместить конструктор arg с собственностью? – hudi

+0

да, просто добавьте '' элементы под 'constructor-args', и они будут установлены после того, как объект был создан. – cowls

+0

вопрос обновлен после вашего ответа, пожалуйста, проверьте его, спасибо – hudi