www.91084.com

GVKun编程网logo

在Spring 3.1中使用beans:profiles之后@Autowired bean未加载(spring加载beans找不到声明)

8

对于在Spring3.1中使用beans:profiles之后@Autowiredbean未加载感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解spring加载beans找不到声明,并且为您

对于在Spring 3.1中使用beans:profiles之后@Autowired bean未加载感兴趣的读者,本文将提供您所需要的所有信息,我们将详细讲解spring加载beans找不到声明,并且为您提供关于Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: pri...、Jackson2和Spring Autowired bean、java – Jackson 2和Spring Autowired bean、java – 在Spring 3中定制Autowire候选bean的宝贵知识。

本文目录一览:

在Spring 3.1中使用beans:profiles之后@Autowired bean未加载(spring加载beans找不到声明)

在Spring 3.1中使用beans:profiles之后@Autowired bean未加载(spring加载beans找不到声明)

beans:profiles在我的xml中使用了这样的代码:

    <beans profile="dev">        <bean id="dataSource" destroy-method="close">            <property name="driverClassName" value="${jdbc.driverClassName}" />            <property name="url" value="${jdbc.internal.url}" />            <property name="username" value="${jdbc.internal.username}" />        </bean>   </beans>

我已经spring.active.profiles在web.xml中设置了:

<servlet>    <servlet-name>myapp</servlet-name>    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>    <init-param>        <param-name>contextConfigLocation</param-name>        <param-value>/WEB-INF/myapp-servlet.xml</param-value>    </init-param>    <init-param>        <param-name>spring.profiles.active</param-name>        <param-value>dev</param-value>    </init-param></servlet>

我的代码结构是这样的:

//controller@Controller public class MyController {  @Autowired  private MyService myService;  ....}//service implementation@Service("myservice")public class MyServiceImpl implements MyService {  @Autowired  DBService dbService;}//db service@Service("dbservice)public class DBServiceImpl implements DbService {  @Autowired  public void setDataSource (Datasource ds) {     this.jdbcTemplate = new JdbcTemplate(ds);  }}

错误:

创建名称为“
myController”的bean时出错:自动连接的依赖项注入失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动装配字段:private
MyService MyController.myService;
嵌套的异常是org.springframework.beans.factory.BeanCreationException:

嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建名称为’dbService’的bean时出错:自动连接依赖项的注入失败;嵌套的异常是org.springframework.beans.factory.BeanCreationException:无法自动装配方法:public
void DBServiceImpl.setDataSource(javax.sql.DataSource);
嵌套的异常是org.springframework.beans.factory.NoSuchBeanDefinitionException:没有找到类型为[javax.sql.DataSource]的匹配bean作为依赖项:至少应有1个可以作为该依赖项的自动装配候选的bean。依赖项注释:{}在org.springframework.beans.factory.support的org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287)处。

答案1

小编典典

我猜您在DispatcherServlet上下文中使用配置文件,而DataSource可能位于根应用程序上下文中。

更新
:尝试使用上下文参数(从此处获取):

<context-param><param-name>spring.profiles.active</param-name><param-value>dev</param-value></context-param>

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: pri...

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: pri...

2019-03-19 16:22:14,945 WARN [main] (org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:486))- Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''bankService'': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.******.seashell.bpc.query.query.service.FscBankPayCodeQueryService com.******.dolphin.service.bank.BankService.fscBankPayCodeQueryService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.******.seashell.bpc.query.query.service.FscBankPayCodeQueryService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:298) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1148) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:458) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:191) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:636) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:934) ~[spring-context.jar:3.2.13.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) ~[spring-context.jar:3.2.13.RELEASE]
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:410) ~[spring-web.jar:3.2.13.RELEASE]
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306) ~[spring-web.jar:3.2.13.RELEASE]
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) ~[spring-web.jar:3.2.13.RELEASE]
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206) ~[catalina.jar:6.0.35]
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705) ~[catalina.jar:6.0.35]
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) ~[catalina.jar:6.0.35]
at org.apache.catalina.core.StandardHost.start(StandardHost.java:840) ~[catalina.jar:6.0.35]
at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1057) ~[catalina.jar:6.0.35]
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:463) ~[catalina.jar:6.0.35]
at org.apache.catalina.core.StandardService.start(StandardService.java:525) ~[catalina.jar:6.0.35]
at org.apache.catalina.core.StandardServer.start(StandardServer.java:754) ~[catalina.jar:6.0.35]
at org.apache.catalina.startup.Catalina.start(Catalina.java:595) ~[catalina.jar:6.0.35]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.7.0_80]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) ~[?:1.7.0_80]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.7.0_80]
at java.lang.reflect.Method.invoke(Method.java:606) ~[?:1.7.0_80]
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289) ~[bootstrap.jar:6.0.35]
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414) ~[bootstrap.jar:6.0.35]
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.******.seashell.bpc.query.query.service.FscBankPayCodeQueryService com.******.dolphin.service.bank.BankService.fscBankPayCodeQueryService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.******.seashell.bpc.query.query.service.FscBankPayCodeQueryService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:531) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:295) ~[spring-beans.jar:3.2.13.RELEASE]
... 28 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.******.seashell.bpc.query.query.service.FscBankPayCodeQueryService] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:997) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:867) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:779) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:503) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) ~[spring-beans.jar:3.2.13.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:295) ~[spring-beans.jar:3.2.13.RELEASE]
... 28 more

 

原因:bean 没有被加载进去

在 xml 中加载进去即可。

Jackson2和Spring Autowired bean

Jackson2和Spring Autowired bean

我的User对象的Jackson序列化遇到问题。有一些带有getter和setter的私有字段。当我做这样的事情时,一切都很好:

public String json() {
   MyUser user = new MyUser();
   user.setUsername("myName");

   return mapper.writeValueAsString(user); // Valid JSON
}

但是我想用Spring Framework自动连接User对象:

@Autowired
private MyUser user;

public String json() {
    System.out.println(user.getUsername()); // Property set before and it works
    return mapper.writeValueAsString(user); // Error
}

这是行不通的。我有一个错误:

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.apache.juli.OneLineFormatter and no properties discovered to create BeanSerializer (to avoid exception,disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.piggymetrics.classes.PiggyUser$$EnhancerBySpringCGLIB$$5f23855e["targetSource"]->org.springframework.aop.target.SimpleBeanTargetSource["beanFactory"]->org.springframework.beans.factory.support.DefaultListableBeanFactory["parentBeanFactory"]->org.springframework.beans.factory.support.DefaultListableBeanFactory["beanClassLoader"]->org.apache.catalina.loader.WebappClassLoader["resources"]->org.apache.catalina.webresources.StandardRoot["context"]->org.apache.catalina.core.StandardContext["logger"]->org.apache.juli.logging.DirectJDKLog["logger"]->java.util.logging.Logger["parent"]->java.util.logging.Logger["handlers"]->org.apache.juli.AsyncFileHandler["formatter"])
at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.failForEmpty(UnknownSerializer.java:59)
at com.fasterxml.jackson.databind.ser.impl.UnknownSerializer.serialize(UnknownSerializer.java:26)

当我尝试忽略这些未知错误时

mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

我得到了无限递归:

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.apache.catalina.core.StandardEngineValve["container"]->org.apache.catalina.core.StandardEngine["pipeline"]->org.apache.catalina.core.StandardPipeline["basic"]->org.apache.catalina.core.StandardEngineValve["container"]
...

看起来Spring在自动装配MyUser实例上发生了问题,因此Jackson无法序列化它。

有办法解决吗?

更新

MyUser类非常简单:

package com.metrics.classes;

import com.metrics.classes.interfaces.User;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;

@Component
@Scope(value = "session",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyUser implements User {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

java – Jackson 2和Spring Autowired bean

java – Jackson 2和Spring Autowired bean

我遇到了我的User对象的Jackson序列化问题.
有一些私人领域有getter和setter.当我做这样的事情时,一切正常:

public String json() {
   MyUser user = new MyUser();
   user.setUsername("myName");

   return mapper.writeValueAsstring(user); // Valid JSON
}

但是我想用Spring Framework自动装配User对象:

@Autowired
private MyUser user;

public String json() {
    System.out.println(user.getUsername()); // Property set before and it works
    return mapper.writeValueAsstring(user); // Error
}

这不起作用.我有一个错误:

com.fasterxml.jackson.databind.JsonMappingException: No serializer found for class org.apache.juli.OneLineFormatter and no properties discovered to create BeanSerializer (to avoid exception,disable SerializationFeature.FAIL_ON_EMPTY_BEANS) ) (through reference chain: com.piggymetrics.classes.PiggyUser$$EnhancerBySpringcglib$$5f23855e["targetSource"]->org.springframework.aop.target.SimpleBeanTargetSource["beanfactory"]->org.springframework.beans.factory.support.DefaultListablebeanfactory["parentbeanfactory"]->org.springframework.beans.factory.support.DefaultListablebeanfactory["beanClassLoader"]->org.apache.catalina.loader.WebappClassLoader["resources"]->org.apache.catalina.webresources.StandardRoot["context"]->org.apache.catalina.core.StandardContext["logger"]->org.apache.juli.logging.DirectJDKLog["logger"]->java.util.logging.Logger["parent"]->java.util.logging.Logger["handlers"]->org.apache.juli.AsyncFileHandler["formatter"])
at com.fasterxml.jackson.databind.ser.impl.UnkNownSerializer.failForEmpty(UnkNownSerializer.java:59)
at com.fasterxml.jackson.databind.ser.impl.UnkNownSerializer.serialize(UnkNownSerializer.java:26)

当我试图忽略这些未知错误时

mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

我得到了无限递归:

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain: org.apache.catalina.core.StandardEngineValve["container"]->org.apache.catalina.core.StandardEngine["pipeline"]->org.apache.catalina.core.StandardPipeline["basic"]->org.apache.catalina.core.StandardEngineValve["container"]
...

看起来Spring在自动装配的MyUser实例上做错了,所以杰克逊无法将其序列化.

有办法解决吗?

UPDATE

MyUser类非常简单:

package com.metrics.classes;

import com.metrics.classes.interfaces.User;
import org.springframework.context.annotation.Scope;
import org.springframework.context.annotation.ScopedProxyMode;
import org.springframework.stereotype.Component;

@Component
@Scope(value = "session",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class MyUser implements User {

    private String username;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
最佳答案
由于您使用MyUser作为Spring托管bean,因此Spring将您的对象包装到代理中 – 因此当您调用mapper.writeValueAsstring(user)时;你实际上是通过代理作为参数.所述代理包含一些属性,即映射器无法序列化.

您可以尝试在序列化之前应用过滤器以仅包含所需的属性:

ObjectMapper mapper = new ObjectMapper();
SimpleFilterProvider simpleFilterProvider = new SimpleFilterProvider()
    .addFilter("myUser",simpleBeanPropertyFilter.filterOutAllExcept("username"));

mapper.setFilters(filterProvider);
return mapper.writeValueAsstring(user);

java – 在Spring 3中定制Autowire候选bean

java – 在Spring 3中定制Autowire候选bean

说我有一个服务接口ServiceInterface和一些实现它的组件的以下结构:ProductAService和ProductBService我还有一个RequestContext bean,它有一个限定属性,表示我们现在正在处理ProductA或ProductB.那么如何可以自动注入自动装配或其他注释正确的实现(ProductAService或ProductBService)到某些需要它的服务(ServiceThatNeedsServiceInterface下面).
public interface ServiceInterface {
  void someMethod();
}

@Component(name="ProductAService")
public class ProductAService implements ServiceInterface {
  @Override public void someMethod() { 
    System.out.println("Hello,A Service"); 
  }
}

@Component(name="ProductBService")
public class ProductBService implements ServiceInterface {
  @Override public void someMethod() { 
    System.out.println("Hello,B Service"); 
  }
}

@Component
public class ServiceThatNeedsServiceInterface {

  // What to do here???
  @Autowired
  ServiceInterface service;

  public void useService() {
    service.someMethod();
  }
}

@Component
@Scope( value = WebApplicationContext.ScopE_REQUEST )
public class RequestContext {
  String getSomeQualifierproperty();
}

解决方法

Spring Source在版本1.1.4中创建了 ServiceLocatorFactoryBean时引用了您的问题.为了使用它,您需要添加类似于下面的界面:
public interface ServiceLocator {
    //ServiceInterface service name is the one 
      //set by @Component
    public ServiceInterface lookup(String serviceName);
}

您需要将以下代码片段添加到您的applicationContext.xml中

<bean id="serviceLocatorfactorybean"https://www.jb51.cc/tag/fig/" target="_blank">fig.ServiceLocatorfactorybean">
    <property name="serviceLocatorInterface"
              value="org.haim.springframwork.stackoverflow.ServiceLocator" />
</bean>

现在您的ServiceThatNeedsServiceInterface将类似于以下内容:

@Component
public class ServiceThatNeedsServiceInterface {
    // What to do here???
    //  @Autowired
    //  ServiceInterface service;

    /*
     * ServiceLocator lookup returns the desired implementation
     * (ProductAService or ProductBService) 
     */ 
 @Autowired
     private ServiceLocator serviceLocatorfactorybean;

     //Let’s assume we got this from the web request 
     public RequestContext context;

     public void useService() {
        ServiceInterface service =  
        serviceLocatorfactorybean.lookup(context.getQualifier());
        service.someMethod();         
      }
}

ServiceLocatorfactorybean将根据RequestContext限定符返回所需的服务.
除了弹簧注释,你的代码不依赖于Spring.
我执行了以上的单元测试

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:meta-inf/spring/applicationContext.xml" })
public class ServiceThatNeedsServiceInterfaceTest {

    @Autowired
    ServiceThatNeedsServiceInterface serviceThatNeedsServiceInterface;

    @Test
    public void testUseService() {
    //As we are not running from a web container
    //so we set the context directly to the service 
        RequestContext context = new RequestContext();
        context.setQualifier("ProductAService");
        serviceThatNeedsServiceInterface.context = context;
        serviceThatNeedsServiceInterface.useService();

        context.setQualifier("ProductBService");
        serviceThatNeedsServiceInterface.context = context;
        serviceThatNeedsServiceInterface.useService();
    }

}

显示控制台
你好,一个服务
你好,B服务

一句警告. api文档说明
“这样的服务定位器…通常将用于原型bean,即对于每个调用返回一个新实例的工厂方法,对于单例bean,最好是直接设置器或构造器注入目标bean.

我不明白为什么会导致一个问题.在我的代码中,它返回相同的服务在两个序列调用serviceThatNeedsServiceInterface.useService();

您可以在GitHub中找到我示例的源代码

今天关于在Spring 3.1中使用beans:profiles之后@Autowired bean未加载spring加载beans找不到声明的介绍到此结束,谢谢您的阅读,有关Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: pri...、Jackson2和Spring Autowired bean、java – Jackson 2和Spring Autowired bean、java – 在Spring 3中定制Autowire候选bean等更多相关知识的信息可以在本站进行查询。

本文标签: