有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将Springbean注入到使用new()创建的外部类中

我试图在课堂上使用spring bean。我正在从另一个Springbean访问这个类。我尝试过使用AutoWireCapableBeanFacory和@Configurable+AspectJ LTW,但我一次又一次地得到java.lang.UnsupportedOperationException

我的设想如下:

ServiceOneImpl调用MyClass,并且MyClass使用另一个名为MyService的bean(自动连线)

//-------------------ServiceOne--------------
@Service("serviceOne")
public class ServiceOneImpl implements ServiceOne {
   @Override
   public void myMethod() {
       ClassA obj = new ClassA(arg1,arg2);
       obj.doSometing();

   } 
}

//-------------------MyService-------------
@Service("myService")
public class MyServiceImpl implements MyService {
   @Override
   public MyDTO getConfiguration(String arg) {
      return myDao.getConfiguration(arg);
   }
}

//-------------------MyClass--------------
@Component
public Class MyClass {

   @Autowired
   private MyService myService;

   private MyDTO myDTO;

   private String mailhost;
   private String arg1;
   private String arg2;

   public A() {
   }

   public A(String param1, String param2) {
       ServletContext context = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
       ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(context);   

       applicationContext.getAutowireCapableBeanFactory().
       autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_AUTODETECT,
       true);
       myDTO = myService.getConfiguration(); 
       mailhost = myDTO.getMailhost();

      //Do some process
   }
   public doSometing() {
      //Do some process
   }       
}

但是我得到java.lang.UnsupportedOperationExceptionMyService没有自动连线,它返回空值

javax.faces.el.EvaluationException: java.lang.UnsupportedOperationException
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
at com.beo.atlas.common.filter.ClientSideCacheClearingFilter.doFilter(ClientSideCacheClearingFilter.java:34)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersisten

我正在使用SpringFramework 4.0.3.RELEASE

我无法解决这个问题。如果有人能给我一些启示,那将对我大有裨益

提前谢谢

伊莫


共 (3) 个答案

  1. # 1 楼答案

    除非有充分的理由这样做,否则在希望Spring将bean连接到对象时不要使用new。避免将域类与Spring绑定

    IMHO,你最好使用一个定制的生成器bean:

    public class ABuilder {
       @Autowired
       private MyService myService;
    
       public A getA(String param1, String param2) {
           A a = new A(param1, param2);
           a.setMyDTO(myService.getConfiguration()); 
           a.setMailhost(myDTO.getMailhost());
           return a;
       }
    }
    

    并相应地修改ServiceOne

    //         -ServiceOne       
    @Autowired
    ABuilder aBuilder;
    
    @Service("serviceOne")
    public class ServiceOneImpl implements ServiceOne {
       @Override
       public void myMethod() {
           ClassA obj = aBuilder.getA(arg1, arg2);
           obj.doSometing();
       } 
    }
    

    这样一来,A(或MyClassClassA)对Spring就没有明确的依赖性,并将通过它的生成器注入其他bean

    当然,这不是真正的代码(参数和命名不一致),但你的代码也不是

  2. # 2 楼答案

    请加上:

    <context:spring-configured />
    

    在spring配置中

    然后在MyClass中添加@Configurable而不是@Component

  3. # 3 楼答案

    我通过向autowired属性添加@Lazy注释解决了这个问题

    未来参考的完整代码:

    //         -ServiceOne       
    @Service("serviceOne")
    public class ServiceOneImpl implements ServiceOne {
       @Override
       public void myMethod() {
           ClassA obj = new ClassA(arg1,arg2);
           obj.doSometing();
    
       } 
    }
    
    //         -MyService      -
    @Service("myService")
    public class MyServiceImpl implements MyService {
       @Override
       public MyDTO getConfiguration(String arg) {
          return myDao.getConfiguration(arg);
       }
    }
    
    //         -MyClass       
    @Component
    public Class MyClass {
    
       @Autowired
       @Lazy
       private MyService myService;
    
       private MyDTO myDTO;
    
       private String mailhost;
       private String arg1;
       private String arg2;
    
       public A() {
       }
    
       public A(String param1, String param2) {
           ServletContext context = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
           ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(context);   
    
           applicationContext.getAutowireCapableBeanFactory().autowireBeanProperties(this,
                    AutowireCapableBeanFactory.AUTOWIRE_BY_NAME,true);
           myDTO = myService.getConfiguration(); 
           mailhost = myDTO.getMailhost();
    
          //Do some process
       }
       public doSometing() {
          //Do some process
       }       
    }
    

    希望它能帮助别人:)