当前位置: 首页 > 面试题库 >

使用Servlet配置Spring Ioc

后易安
2023-03-14
问题内容

我是Spring的新手,想将spring ioc连接到我的小型(测试)网络应用程序中。

我有这样的Servlet ProductServlet

public class ProductServlet extends HttpServlet{
    private static final long serialVersionUID = 1L;
    private RequestHelper requestHelper;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request);
    }

    private void processRequest(HttpServletRequest request){
        requestHelper.process(request);
    }

    public RequestHelper getRequestHelper() {
        return requestHelper;
    }

    public void setRequestHelper(RequestHelper requestHelper) {
        this.requestHelper = requestHelper;
    }

}

和我的web.xml:

  <servlet>
    <servlet-name>ProductServlet</servlet-name>
    <servlet-class>com.epam.productshop.controller.ProductShop</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ProductServlet</servlet-name>
    <url-pattern>/ProductServlet</url-pattern>
  </servlet-mapping>

     <listener>
      <listener-class>
        org.springframework.web.context.ContextLoaderListener
      </listener-class>
   </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring-config.xml
        </param-value>
    </context-param>

而且我也有这样的Spring配置XML:

<bean id="factory" class="com.epam.productshop.readerfactory.ReaderFactory">
    <property name="file" value="/xml/products.xml" />
</bean>

<bean id="requestHelper" class="com.epam.productshop.requesthelper.RequestHelper" scope="singleton">
    <property name="factory" ref="factory" />
</bean>

<bean name="ProductServlet" class="com.epam.productshop.controller.ProductServlet" scope="singleton">
    <property name="requestHelper" ref="requestHelper"/>        
</bean>

我有这样的问题:

我希望在servlet init()期间将requestHelper对象设置为我的servlet。但除了这个,它还给了我nullpointer。

我正在尝试从实现servlet
HttpRequestHandler,将其写入SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext());init()方法以及我在互联网上看到的其他东西,但所有这些都不能解决我的问题。

请帮我


问题答案:

在您的问题中

<bean name="ProductServlet" class="com.epam.productshop.controller.ProductServlet" scope="singleton">
    <property name="requestHelper" ref="requestHelper"/>        
</bean>

您不能使用Spring容器实例化servlet,它们是由servlet容器实例化的。您只是在声明ProductServlet的另一个实例。

因此,当init()调用Servlet 方法时,您应该调用

SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, getServletContext());`

要注入requestHelper @Autowired,请在Servlet中声明带注释的字段或属性:

private RequestHelper requestHelper;

@Autowired
public void setRequestHelper(RequestHelper requestHelper){
  this.requestHelper = requestHelper;
}

来自 processInjectionBasedOnServletContext javadoc:

处理 @Autowired 注射给定目标对象,根据与存储在ServletContext当前根web应用上下文。



 类似资料:
  • 问题内容: 我想配置为能够在视图中使用hibernate延迟初始化,因此我在web.xml中添加了过滤器定义,但是它不起作用,我仍然遇到相同的延迟初始化异常,这是我所做的: applicationContext: 请告知为什么我 仍然会收到延迟初始化异常 ,谢谢。 问题答案: 似乎构造过滤器链的顺序取决于过滤器映射元素出现的顺序。 换句话说,请尝试将OpenSessionInViewFilter的

  • 问题内容: 我想使用Spring Boot在不同端口上加载具有嵌入式tomcat配置的两个servlet容器。 有谁知道如何实现这一目标? 问题答案: 它应该很简单:只需根据需要创建尽可能多的类型,并为每个类型提供同的端口。在这里的示例中,两个上下文分别是父级和子级,但这不是设置的必要部分。

  • 我试图根据文档(以及相关的SO问题)设置LOG4J,但它不会创建假定的文件,但WildFly中有这样的日志: web.xml app.war/WEB-INF/类/log4j2.xml app.war/WEB-INF/lib 你能告诉我怎么了吗?我尝试在web.xml中注释掉上下文参数,并依赖自动配置,但是没有变化。 编辑 当我添加以下代码时 失败的方式不同(我现在没有时间调查)

  • 引入 Maven 依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core</artifactId> <version>${shardingsphere.version}</version> </dependency> <!-- 使用

  • 引入 Maven 依赖 <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>shardingsphere-jdbc-core</artifactId> <version>${shardingsphere.version}</version> </dependency> 规则配置 Sha

  • 我目前正在寻找一种动态组装config-keys(回退处理)的方法,然后在我们的microprofile-config.properties文件中查找这些。这样的文件可能如下所示: 因此,当存在客户和子客户时,使用on 我得到这个问题的原因是我想使用注释,所以没有ConfigProvider.getConfig()。这意味着我必须在自定义的中组装动态配置键。 我知道ConfigSources是在服