首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我可以自动或注入pojo,但我不能自动或注入RestTemplate

为什么我可以自动或注入pojo,但我不能自动或注入RestTemplate
EN

Stack Overflow用户
提问于 2014-12-16 20:37:13
回答 1查看 4.7K关注 0票数 0

我在这个论坛上读到了很多关于在尝试使用pojo时发生的类似问题的文章,而修复的答案通常与component-scan@Component/@Controller有关。但在我的例子中,我设法自动读取了我的pojo (Mas60010),但是我不能从一个没有编写代码的包中自动生成RestTemplateObjectMapper,可能还有任何其他对象。

简单地说,我只提到RestTemplate。我做错什么了?我想问题要么在于库,要么是配置。注意:请不要仅仅通过显示一个与他自己的pojo相关的问题来指出这个问题是重复的。你可以看到,这不是我的问题,因为我有能力做到这一点。问题是jars中的类包含在我的项目中。

代码语言:javascript
复制
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

代码语言:javascript
复制
<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>

//Pojo -我可以自动完成它

代码语言:javascript
复制
package com.ma.log.domain;

import org.springframework.stereotype.Service;

@Service
public class Mas60010 {

所有图书馆

  • “验证-api-1.0.0.GA.jar”
  • “联盟-1.0.jar”
  • 公用-日志-1.1.1.jar
  • "db2java.zip“
  • hibernate-验证器-4.1.0.Final.jar
  • "hibernate-validator-annotation-processor-4.1.0.Final.jar“
  • “jackson-注释-2.2.3.jar”
  • 杰克逊-核心-2.2.3.jar
  • 杰克逊数据库-2.2.3.jar
  • "slf4j-api-1.7.5.jar“
  • 弹簧-AOP-4.1.2.RELEASE.jar
  • 春豆-4.1.2.RELEASE.JAR
  • “spring-上下文-4.1.2.RELEASE.jar”
  • “spring-上下文-支持-4.1.2.RELEASE.jar”
  • 弹簧-核心-4.1.2.RELEASE.JAR
  • “spring-表达式-4.1.2.RELEASE.jar”
  • "spring-web-4.1.2.RELEASE.jar“
  • "spring-webmvc-4.1.2.RELEASE.jar“
  • "upload.jar“

//StackTrace

代码语言:javascript
复制
[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)

启用WebSphere自由配置文件的特性

代码语言:javascript
复制
<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

代码语言:javascript
复制
@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

代码语言:javascript
复制
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 ">4.xsd"> MHE

代码语言:javascript
复制
       <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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-18 19:13:25

代码语言:javascript
复制
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。你可以用这个得到你想要的豆子。

代码语言:javascript
复制
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注释。

代码语言:javascript
复制
@Component
@Scope("prototype")
public class Lo_DisplayHandler extends Lo_Handler { ... }

最后一个注意事项不是每次需要查找ApplicationContext,而是希望在servlet的init方法中进行一次查找,并将其存储为实例变量。节省了一行代码和一些性能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27513495

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档