Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 春天不是';t,我做错了什么?_Java_Spring_Servlets_Dependency Injection - Fatal编程技术网

Java 春天不是';t,我做错了什么?

Java 春天不是';t,我做错了什么?,java,spring,servlets,dependency-injection,Java,Spring,Servlets,Dependency Injection,我只是想尝试一下Spring,但我似乎错过了一些东西。它似乎很好地加载了Spring和Bean,但是当涉及到用autowired注入这些Bean时,它不起作用。有人有线索吗 Spring和mainServlet的web.xml部分: <welcome-file-list> <welcome-file>/login.jsp</welcome-file> </welcome-file-list> <!--

我只是想尝试一下Spring,但我似乎错过了一些东西。它似乎很好地加载了Spring和Bean,但是当涉及到用autowired注入这些Bean时,它不起作用。有人有线索吗

Spring和mainServlet的web.xml部分:

    <welcome-file-list>
        <welcome-file>/login.jsp</welcome-file>
    </welcome-file-list>

    <!-- Spring Dependency Injection -->

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

  <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
    </listener-class>
 @Service
public class MainServlet extends HttpServlet {

    @Autowired
    @Qualifier("UserManager")
    private UserManagerInterface userManager;
    Logger log;

    public MainServlet() {
        log = Logger.getLogger(getClass());
    }

    public boolean userLoggedIn(String username, String password) {     
        return SecurityManager.getInstance().credentialsValid(username, password);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        processRequest(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        processRequest(req, resp);
    }

    public void processRequest(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        HttpSession session = ((HttpServletRequest) request).getSession();

        String username = (String) session.getAttribute("username");
        boolean authenticated = (boolean) session.getAttribute("authenticated");

        User user = userManager.getUserByEmail(username);

        WelcomeGenerator welcomeGenerator = new WelcomeGenerator();

        if (authenticated) {
            generateResponse(response, welcomeGenerator.WelcomeMessage(user), "The secret code is " + session.getAttribute("secretParameter"));
        } else {
            generateResponse(response, welcomeGenerator.wrongCredentialsMessage(username), "Secret code is hidden, because authentication failed");
        }
    }

    public void generateResponse(HttpServletResponse response, String welcomeMessage, String additionalData) throws IOException {       
        HtmlGenerator generator = new HtmlGenerator("PIRS");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.write(generator.printHeader());
        out.write(generator.printCenter(welcomeMessage));
        out.write(generator.printCenter(additionalData));
        out.write(generator.printFooter());
    }

    public UserManagerInterface getUserManager() {
        return userManager;
    }

    public void setUserManager(UserManagerInterface userManager) {
        this.userManager = userManager;
    }               
}
MainServlet:

    <welcome-file-list>
        <welcome-file>/login.jsp</welcome-file>
    </welcome-file-list>

    <!-- Spring Dependency Injection -->

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

  <listener>
        <listener-class>
            org.springframework.web.context.ContextLoaderListener
    </listener-class>
 @Service
public class MainServlet extends HttpServlet {

    @Autowired
    @Qualifier("UserManager")
    private UserManagerInterface userManager;
    Logger log;

    public MainServlet() {
        log = Logger.getLogger(getClass());
    }

    public boolean userLoggedIn(String username, String password) {     
        return SecurityManager.getInstance().credentialsValid(username, password);
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        processRequest(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        processRequest(req, resp);
    }

    public void processRequest(HttpServletRequest request, HttpServletResponse response) 
            throws ServletException, IOException {

        HttpSession session = ((HttpServletRequest) request).getSession();

        String username = (String) session.getAttribute("username");
        boolean authenticated = (boolean) session.getAttribute("authenticated");

        User user = userManager.getUserByEmail(username);

        WelcomeGenerator welcomeGenerator = new WelcomeGenerator();

        if (authenticated) {
            generateResponse(response, welcomeGenerator.WelcomeMessage(user), "The secret code is " + session.getAttribute("secretParameter"));
        } else {
            generateResponse(response, welcomeGenerator.wrongCredentialsMessage(username), "Secret code is hidden, because authentication failed");
        }
    }

    public void generateResponse(HttpServletResponse response, String welcomeMessage, String additionalData) throws IOException {       
        HtmlGenerator generator = new HtmlGenerator("PIRS");
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();

        out.write(generator.printHeader());
        out.write(generator.printCenter(welcomeMessage));
        out.write(generator.printCenter(additionalData));
        out.write(generator.printFooter());
    }

    public UserManagerInterface getUserManager() {
        return userManager;
    }

    public void setUserManager(UserManagerInterface userManager) {
        this.userManager = userManager;
    }               
}
结果当然是调用userManager时出现了一个空指针异常,这应该是由Spring注入的

java.lang.NullPointerException
    at com.nortal.pirs.presentation.web.MainServlet.processRequest(MainServlet.java:58)
    at com.nortal.pirs.presentation.web.MainServlet.doPost(MainServlet.java:47)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
然而Spring确实加载了bean,它只是不注入bean,也不抛出任何错误,这是为什么呢

2013-03-08 03:48:42,834 [localhost-startStop-1] INFO  org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6a4ac9fb: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.config.internalBeanConfigurerAspect,mainController,SecurityManager,**UserManager**,VisitManager,**mainServlet**,org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#0,org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy

您的servlet不可配置。因为它的生命周期不是由Spring控制的,所以这是让它自动连接的唯一方法


哦,您的servlet肯定不是
@服务

,这是因为servlet是由Spring容器管理的。 Servlet由Servlet容器管理

但幸运的是,Spring提供了一种实用方法来获取SpringApplicationContext,从而从Servlet中获取bean。 这是通过使用

示例代码

ApplicationContext ctx = 
                    WebApplicationContextUtils.
                          getWebApplicationContext(session.getServletContext());
UserManagerInterface userManager = (UserManagerInterface )ctx.getBean("UserManager");

不止这些。您的servlet不是由spring管理的,因此它不能将其他bean注入其中。@Sotirios:那不是真的。看见它的目标是域对象,但对任何对象都有效。在这个问题的上下文中,servlet容器将实例化他的
MainServlet
,那么Spring如何知道将任何内容自动连接到其中?@Sotirios:使用AspectJ构建时或加载时字节码编织,您可以让Spring控制任何对象的构造,它管理的不仅仅是豆子。我之前评论中的链接是参考指南中描述其工作原理的部分。我也尝试了可配置,没有任何变化,除了将服务更改为可配置之外,还需要做什么?还有,我怎样才能使所有这些servlet Spring易于管理?为什么不使用控制器而不是servlet
@service
注释并不适用于servlet。请查看此内容。应该与您的问题相同。
2013-03-08 03:48:42,834 [localhost-startStop-1] INFO  org.springframework.beans.factory.support.DefaultListableBeanFactory - Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@6a4ac9fb: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.config.internalBeanConfigurerAspect,mainController,SecurityManager,**UserManager**,VisitManager,**mainServlet**,org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#0,org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#0,org.springframework.context.annotation.ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor#0]; root of factory hierarchy
ApplicationContext ctx = 
                    WebApplicationContextUtils.
                          getWebApplicationContext(session.getServletContext());
UserManagerInterface userManager = (UserManagerInterface )ctx.getBean("UserManager");