我在这个论坛上读到了很多关于尝试Autowire pojo时发生的类似问题的文章,通常修复的答案与component-scan
或@component
/@controller
有关。但是,在我的例子中,我设法autowire我的pojo(Mas60010),但我不能autowireRESTTemplate
或ObjectMapper
以及可能来自我没有编写代码的包的任何其他对象。
为了简单起见,我只提到resttemplate
。我做错了什么?我想问题要么出在库上,要么出在html" target="_blank">配置上。注意:请不要仅仅通过显示一个与他自己的POJO相关的问题来指出这个问题是重复的。你可以看到这不是我的问题,因为我能够管理这一点。问题在于我的项目中包含的JAR中的类。
package com.ma.mhe.log.handler;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.client.RestTemplate;
@Component
public class Lo_DisplayHandler extends Lo_Handler {
@Autowired private Mas60010 _mas60010; //this work perfectly
@Autowired private RestTemplate restTemplate; //this always cause nullPointException
mvc-dispatcher-servlet.xml
<context:annotation-config />
<mvc:annotation-driven />
<context:component-scan base-package="com.ma.mhe.log.handle, com.ma.mhe.log.domain" />
<context:property-placeholder location="classpath:restServices.properties"/>
<mvc:resources mapping="/**" location="/" />
<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>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<ref bean="jsonMessageConverter"/>
</list>
</property>
</bean>
<bean id="jsonMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
</bean>
<!-- I was expecting this line to be enouth -->
<bean id="restTemplate" class="org.springframework.web.client.RestTemplate">
</bean>
//波乔--我可以自吹自擂
package com.ma.log.domain;
import org.springframework.stereotype.Service;
@Service
public class Mas60010 {
所有库
//Stacktrace
[12/17/14 10:38:54:243 CST] 00000033 SystemErr R at com.ma.mhe.log.handler.Lo_DisplayHandler.lastPage(Lo_DisplayHandler.java:181)
[12/17/14 10:38:54:246 CST] 00000033 SystemErr R at com.ma.mhe.log.Lo_Servlet.doDisDis(Lo_Servlet.java:164)
[12/17/14 10:38:54:248 CST] 00000033 SystemErr R at com.ma.mhe.log.Lo_Servlet.doProcess(Lo_Servlet.java:51)
[12/17/14 10:38:54:250 CST] 00000033 SystemErr R at com.ma.mhe.log.Lo_Servlet.doPost(Lo_Servlet.java:24)
[12/17/14 10:38:54:253 CST] 00000033 SystemErr R at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
[12/17/14 10:38:54:255 CST] 00000033 SystemErr R at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
[12/17/14 10:38:54:257 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1274)
[12/17/14 10:38:54:260 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:767)
[12/17/14 10:38:54:261 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:469)
[12/17/14 10:38:54:262 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1060)
[12/17/14 10:38:54:263 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRequestDispatcher.java:1377)
[12/17/14 10:38:54:265 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppRequestDispatcher.java:185)
[12/17/14 10:38:54:266 CST] 00000033 SystemErr R at com.ma.mhe.Mhe_ControllerServlet.doProcess(Mhe_ControllerServlet.java:83)
[12/17/14 10:38:54:267 CST] 00000033 SystemErr R at com.ma.mhe.Mhe_ControllerServlet.doPost(Mhe_ControllerServlet.java:32)
[12/17/14 10:38:54:268 CST] 00000033 SystemErr R at javax.servlet.http.HttpServlet.service(HttpServlet.java:595)
[12/17/14 10:38:54:269 CST] 00000033 SystemErr R at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
[12/17/14 10:38:54:270 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1274)
[12/17/14 10:38:54:271 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:767)
[12/17/14 10:38:54:272 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:469)
[12/17/14 10:38:54:273 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1060)
[12/17/14 10:38:54:275 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:81)
[12/17/14 10:38:54:276 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:885)
[12/17/14 10:38:54:277 CST] 00000033 SystemErr R at com.ibm.ws.webcontainer.osgi.DynamicVirtualHost$2.run(DynamicVirtualHost.java:266)
[12/17/14 10:38:54:277 CST] 00000033 SystemErr R at com.ibm.ws.http.dispatcher.internal.channel.HttpDispatcherLink$TaskWrapper.run(HttpDispatcherLink.java:776)
[12/17/14 10:38:54:278 CST] 00000033 SystemErr R at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
[12/17/14 10:38:54:279 CST] 00000033 SystemErr R at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
[12/17/14 10:38:54:280 CST] 00000033 SystemErr R at java.lang.Thread.run(Thread.java:662)
IBM WebSphere Liberty Profile启用的特性
<featureManager>
<feature>jsp-2.2</feature>
<feature>localConnector-1.0</feature>
<feature>jdbc-4.0</feature>
<feature>jaxrs-1.1</feature>
<feature>json-1.0</feature>
<feature>cdi-1.0</feature>
<feature>managedBeans-1.0</feature>
<feature>beanValidation-1.0</feature>
</featureManager>
//类Lo_DisplayHandler
@Component
public class Lo_DisplayHandler extends Lo_Handler {
public Lo_DisplayHandler() {
super();
}
@Autowired
private Mas60010 _mas60010;
@Autowired private RestTemplate restTemplate;
public Lo_DisplayHandler(HttpServletRequest request,HttpServletResponse response) {
super();
this.request = request;
this.response = response;
}
public void lastPage() {
//RestTemplate restTemplate = new RestTemplate(); //if I uncomment this line and comment the @Autowired it will work
ObjectMapper mapper = new ObjectMapper();
try{
myPojoParameters...
//the next line rises nullPointExcepetion if I choose Autowired instead of new RestTemplate()
LogDisplay _l = restTemplate.postForObject(myServiceUrl,myPojoParameters, LogDisplay.class);
Lo_DisplayRecord lo_DisplayRecord = new Lo_DisplayRecord();
ArrayList<Lo_DisplayRecord> displayValues = new ArrayList<Lo_DisplayRecord>();
for(int i = 0; i < _l.getDisplayValues().size(); i++){
lo_DisplayRecord = mapper.convertValue(_l.getDisplayValues().get(i), Lo_DisplayRecord.class);
displayValues.add(lo_DisplayRecord);
}
Some not relevant operations...
}catch(Exception e){
e.printStackTrace();
//lo_servlet
package com.ma.mhe.log;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.ma.mhe.Mhe_Servlet;
import com.ma.mhe.PageFlow;
import com.ma.mhe.log.handler.*;
public class Lo_Servlet extends Mhe_Servlet {
private String _module = "lo public void init(){}
public void doPost(
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
doProcess(request,response);
}
public void doGet(
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
doProcess(request,response);
}
public void doProcess(
javax.servlet.http.HttpServletRequest request,
javax.servlet.http.HttpServletResponse response)
throws javax.servlet.ServletException, java.io.IOException {
HttpSession session = request.getSession();
int val = setTask(session,request);
switch(val){
//FILTER PAGE
case 1:doFilRep(request,response);break;
case 2:doFilFil(request,response);break;
case 3:doFilDis(request,response);break;
case 4:doFilDef(request,response);break;
//DISPLAY PAGE
case 5:doDisRep(request,response);break;
case 6:doDisFil(request,response);break;
case 7:doDisDis(request,response);break;
private void doDisDis(HttpServletRequest request,HttpServletResponse response){
Lo_DisplayHandler display = null;
try{
display = new Lo_DisplayHandler(request,response);
display.lastPage();
}catch(Exception e){
}finally{
display = null;
}
}
//web.xml http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd“>MHE
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>myservice</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/mvc-dispatcher-servlet.xml</param-value>
</init-param>
</servlet>
<servlet>
<description>
</description>
<display-name>Lo_Servlet</display-name>
<servlet-name>Lo_Servlet</servlet-name>
<servlet-class>com.ma.mhe.log.Lo_Servlet</servlet-class>
</servlet>
... others servlets configuration like this
private void doDisDis(HttpServletRequest request,HttpServletResponse response){
Lo_DisplayHandler display = null;
try {
display = new Lo_DisplayHandler(request,response);
display.lastPage();
}catch(Exception e){
}finally{
display = null;
}
}
上面的代码正在创建LO_DisplayHandler
类的新实例。这些实例不是由Spring管理的,所以基本上@autowired
在这里是非常没用的。Spring只会对它所知道的bean进行依赖注入。
假设使用ContextLoaderListener
加载spring配置,则可以使用WebApplicationContextUtils
获取ApplicationContext
。你可以用这个来得到你想要的豆子。
private void doDisDis(HttpServletRequest request,HttpServletResponse response){
Lo_DisplayHandler display = null;
try {
ApplicationContext context = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
display = context.getBean(Lo_DisplayHandler.class, request, response);
display.lastPage();
}catch(Exception e){
}finally{
display = null;
}
}
为了完成这项工作,您必须使lo_displayhandler
成为一个原型bean,这意味着每次执行getbean
调用时都会创建一个新实例。为此,将@scope
注释添加到类中。
@Component
@Scope("prototype")
public class Lo_DisplayHandler extends Lo_Handler { ... }
最后一个注意,不是每次需要查找applicationcontext
,而是在servlet的init
方法中查找一次,并将其存储为实例变量。节省了一行代码和一些性能。
在Spring中,我可以使用@值注入配置各种对象,如int、boolean、String等。我甚至可以用一个@值注入配置整个映射结构。 假设我们有以下TCP服务器规范类: 我可以按名称插入多个服务器规范的映射,执行。。。 。。。使用以下YAML配置(application-test1.yml): 但通常需要介于两者之间:只注入一个TcpServerSpec: 然后我可以成功通过以下测试: 为什么这
我找到了一些答案:https://stackoverflow.com/a/21218921/2754014 关于依赖注入。没有任何注释,如,或。让我们假设此示例没有任何 XML 配置 的 bean (除了简单
我遇到了这个代码 我在字段上看到过@autowire,它的意思是按类型自动连接,使用这个字段的类将获得特定类型的bean。 但是在上面的代码中,我不确定是谁在使用这个RootResource bean? 这是spring-泽西Rest项目。 据我所知,spring将创建RootResource的bean,将使用这个bean来设置它的属性。(我看不到此bean的任何显式配置) 我的问题是, 1)这个
本文向大家介绍Spring中@Autowire注入的深入讲解,包括了Spring中@Autowire注入的深入讲解的使用技巧和注意事项,需要的朋友参考一下 一直在思考spring的@Autowire注入属性时到底是按类型注入还是按名称注入,今天写了一个测试来证明一下。 定义接口TestService 定义接口实现:TestServiceImpl1和TestServiceImpl2 定义一个bean
问题内容: 我有 一切都正确加载。 然后在我的JavaScript中,我尝试注入ngCookies: 但是它似乎找不到$ cookies: 问题答案: 我不确定您的功能用例是什么,但是您不能在配置块中注入服务(即服务)。仅常量和提供程序可以注入配置块内。 您可以将服务注入运行块,但我不知道这是否对您有帮助,因为我不确定您打算如何处理这些cookie。 顺便说一句:您似乎在混合主角度文件和模块的版本
问题内容: 我有一个通用的抽象模板类。我以为如果创建特定于类型的生产者,则可以直接在通用类中注入一些DAO服务。但是我不能。 为什么?我该如何解决? 当我注入一个例如它完美地工作。但是没有泛型… 问题答案: 当您要求 容器知道您要一个类型为的bean 。如果存在这样的bean并且其类型信息已知,则容器可以满足注入。例如,类型信息保留在带注释的方法中 容器使用反射来检索该参数化的类型,并将其与请求的