【问题标题】:Spring and auto-wiring: NullPointerException弹簧和自动装配:NullPointerException
【发布时间】:2011-11-23 14:29:51
【问题描述】:

我正在尝试掌握 Spring 中的自动装配,但我似乎无法正确实例化 bean(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!
    }
}

这是 servlet 配置:

<?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>

有什么想法吗?

【问题讨论】:

  • 你确定标签很容易被依赖注入 - 你不应该这样做:ApplicationContext context = getContext(); documentBuilder = context.getBean("documentBuilder");而是?
  • 老实说,我不知道。我对 Spring 和 DI 完全陌生!
  • 看起来我是对的——标签不是由 Spring 管理的——所以你不能自动注入依赖项

标签: spring autowired


【解决方案1】:

你只能注入spring beans!但是 Jsp-Tags 不是 Spring Beans,所以 Autowird 注解将被完全忽略,因此该字段为 null。

有两种解决方案:

【讨论】:

  • 这是一个可行的解决方案。我已经多次使用@Configurable 在非 Spring 管理的对象中成功地自动装配东西。
【解决方案2】:

尝试像这样修改代码

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

【讨论】:

  • 最好解释一下您所做的更改以及您认为应该进行此类更改的原因。
  • 刚刚更改了对 setter 方法的接线,因为它可能会更改具有不正确 null 值的 documentBuilder 字段。
【解决方案3】:

如果您将标记类标记为 Spring bean,则可以使用 @Autowired。但这很愚蠢,因为简单的标签不会被容器缓存。每个请求都会创建自己的标签实例,但连接只发生在容器开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-18
    • 2014-07-08
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多