Пружина и авто-проводка: NullPointerException - PullRequest
2 голосов
/ 23 ноября 2011

Я пытаюсь справиться с автоматическим подключением весной, но, похоже, не могу правильно создать экземпляр компонента (a DocumentBuilder). Я создал собственный тег JSP как таковой:

public class MyTag extends SimpleTagSupport {

    @Autowired
    private DocumentBuilder documentBuilder;

    public void setBuilder(DocumentBuilder builder) {
        this.documentBuilder = builder;
    }

    @Override
    public void doTag() throws IOException {
        // documentBuilder is null in here!
    }
}

Это конфигурация сервлета:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

    <!-- Scan for HTTP/REST controllers -->
    <context:component-scan base-package="the.right.package" />

    <context:annotation-config/>

    <bean id="documentBuilderFactory"
          class="javax.xml.parsers.DocumentBuilderFactory"
          factory-method="newInstance">
        <property name="validating" value="false" />
        <property name="ignoringElementContentWhitespace" value="true" />
    </bean>

    <bean id="documentBuilder" class="javax.xml.parsers.DocumentBuilder"
          factory-bean="documentBuilderFactory"
          factory-method="newDocumentBuilder">
    </bean>

</beans>

Есть идеи?

Ответы [ 3 ]

5 голосов
/ 23 ноября 2011

Вы можете вводить только весной бобы! Но Jsp-теги не являются Spring Beans, поэтому аннотация Autowird будет полностью проигнорирована, поэтому поле имеет значение null.

Есть два решения:

0 голосов
/ 18 июня 2013

Вы можете использовать @Autowired, если отметите свой класс тега как Spring bean. Но это глупо, потому что простые теги не кэшируются контейнером. Каждый запрос создает собственный экземпляр тега, но запуск проводки происходит только в зависимости от ситуации.

0 голосов
/ 23 ноября 2011

Попробуйте изменить код следующим образом

public class MyTag extends SimpleTagSupport {

    private DocumentBuilder documentBuilder;

    @Autowired
    public void setBuilder(DocumentBuilder builder) {
        this.documentBuilder = builder;
    }

    @Override
    public void doTag() throws IOException {
        // documentBuilder is null in here!
    }
}
...