BeanInstantiationException - Конструктор выдал исключение; вложенным исключением является java.lang.NullPointerException

У меня странная проблема: я не могу создать экземпляр bean-компонента, который вводится в другой bean-компонент.

PropertiesUtil - это рассматриваемый компонент. Он вводится в класс LoginController следующим образом в моем sn-servlet.xml

  <bean name="/Login.html" class="org.sn.auth.LoginController">
    <property name="dbUtil" ref="dbUtil"/>
    <property name="propertiesUtil" ref="propertiesUtil"/>
  </bean>

и мой PropertiesUtil.java

public class PropertiesUtil {

    private Properties properties;

    public PropertiesUtil() {
        properties = new Properties();
        try {            
                properties.load(ClassLoader.getSystemResourceAsStream(
                                    "/resources/messages.properties"));
        }
        catch (IOException ioException) {
            ioException.printStackTrace();
        }
    }
}

И NullPointerException возникает в строке, где я пытаюсь использовать ресурс с properties по load. Я действительно смущен, почему он нулевой, когда я явно создаю его в предыдущей строке.

Я также пытался внедрить экземпляр properties как constructor-arg, а также как property из sn-servlet.xml, но все напрасно.

Есть ли что-то вроде того, что я не должен выполнять какие-либо операции в конструкторе, когда этот bean-компонент вводится пружиной в какой-то другой класс?

Спасибо за любые идеи!


person asgs    schedule 12.03.2011    source источник


Ответы (1)


Ознакомьтесь с javadoc для ClassLoader.getResourceAsStream(). Он возвращает null, если ресурс не может быть найден. Таким образом, может показаться, что messages.properties не могут быть найдены, и метод Properties.load() выдаст NullPointerException при попытке чтения из нулевого InputStream.

person krock    schedule 12.03.2011
comment
ой! Я разместил его в разделе WEB-INF/resources. Каков правильный способ получить к нему доступ? NPE заставил меня подумать, что properties на самом деле становится нулевым! - person asgs; 12.03.2011
comment
Проверьте этот вопрос, WEB-INF не находится в пути к классам, поэтому различные getResource..() Методы не смогут его найти. Переместите файл в WEB-INF/classes/resources/messages.properties, и вы сможете его забрать. - person krock; 12.03.2011
comment
черт! Я только что узнал несколько дней назад, что WEB-INF/classes и WEB-INF/lib находятся в пути к классам. Большое спасибо! - person asgs; 12.03.2011