我正在使用Spring和Spring MVC构建应用程序。对我来说,使用@Autowired不是一个选项(是一项要求)。
我已经构建了一个web.xml文件,如:
<!-- Spring context -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring MVC -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>namespace</param-name>
<param-value>mvc-dispatcher-context</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
所以我加载了Spring上下文和Spring MVC Servlet。
我的mvc-dispatcher-context.xml文件如下所示:
<beans ...>
<mvc:annotation-driven />
<context:component-scan base-package="com.pacage.controller"/>
<mvc:resources mapping="/resources/**" location="/WEB-INF/static/" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/pages/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
</beans>
所以我可以在我的控制器中使用@Controller注释......
在我的applicationContext.xml上,我定义了我的Spring bean,例如本案例中的我的服务&#34; OneService.java&#34;
我有一个控制器:
@Controller
@RequestMapping("/main")
public class MainController {
private OneService oneService;
//getters and setters
...
}
我想在ApplicationContext.xml文件中定义注入OneService。 我已经尝试了几种方法,但是我无法使它工作,总是在控制器内部使用我的服务时出现NullPointerException。
有没有办法在这个mvc servlet中使用applicationContext.xml中定义的bean?
谢谢大家的时间!
[UPDATE]
如果我在servlet中定义了所有的applicatonContext,我就无法使用它。有没有办法让servlet上下文成为应用程序conntext的子项才能使用应用程序上下文bean?
由于
答案 0 :(得分:0)
应用程序上下文已经是&#34;父亲&#34;所以在其中定义的bean可用于其子节点中定义的bean。但是如果需要,您可以在应用程序上下文中定义。 问题可能是您尝试注入服务的方式。
如果将@Autowired添加到您的服务中,它将起作用,因为该bean在您的控制器中可用,但如果您不想使用注释,则需要在xml上下文中显式创建和注入bean。 首先,您需要在控制器中添加一个setter:
<form role="form" name="createProjectForm" class="form-validation">
<div class="form-group">
<label class="control-label text-center center-block" for="project.name">
Name Your Project
</label>
<div class="input-icon right">
<input type="text" placeholder="type here" name="project.name"
ng-model="project.name" required="required" class="form-control" add-icon-element/>
</div>
</div>
<form>
然后在你的应用程序上下文中你会这样做:
public void setOneService(OneService oneService) {
this.oneService = oneService;
}
您仍然可以执行此操作并将服务声明保留在应用程序上下文中,并将控制器保留在servlet上下文中。