Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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 向使用new()创建的外部类注入Springbean_Java_Spring_Spring Mvc - Fatal编程技术网

Java 向使用new()创建的外部类注入Springbean

Java 向使用new()创建的外部类注入Springbean,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在尝试在类中使用Springbean。我正在从另一个Springbean访问这个类。我曾尝试使用AutoWireCapableBeanFacory和@Configurable+AspectJ LTW,但一次又一次地得到java.lang.UnsupportedOperationException 我的设想如下: ServiceOneImpl调用MyClass,并且MyClass使用另一个名为MyService(自动连线)的bean 但是我得到的是java.lang.UnsupportedOp

我正在尝试在类中使用Springbean。我正在从另一个Springbean访问这个类。我曾尝试使用
AutoWireCapableBeanFacory
和@Configurable+AspectJ LTW,但一次又一次地得到
java.lang.UnsupportedOperationException

我的设想如下:

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

但是我得到的是
java.lang.UnsupportedOperationException
MyService
没有自动连接,它返回空值

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
我使用的是
springframework4.0.3.RELEASE

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

提前谢谢

iMmo

请添加:

<context:spring-configured />

在spring配置中


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

如果希望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
(或
MyClass
ClassA
)就可以对Spring没有显式的依赖性,并将通过其生成器注入其他bean


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

我通过向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
   }       
}

希望它能帮助别人:)

所有这些似乎都是春豆,那你为什么要用新的呢?改为在Spring上下文中配置工厂。@组件标记是我的一个错误,因为我认为使用它会使它成为一个bean,实际上“MyClass”是一个常见的类,我需要使用构造函数重载调用该类,我的项目负责人希望将其用于新的MyClass(…)构造函数。我仍然认为最干净的方法是在Spring中为类创建一个工厂,它可以在类中注入更多的依赖项。我尝试过@Configurable and-javaagent:Spring-aspect.jar,但没有效果,我已经在我的问题中提到了,谢谢兄弟的宝贵建议。我会看一看,我一定会尝试的。但我在自动连线bean中添加了@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
   }       
}