对于在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找不到声明)
- 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找不到声明)
我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...
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
我的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
我遇到了我的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;
}
}
您可以尝试在序列化之前应用过滤器以仅包含所需的属性:
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
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(); }
解决方法
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等更多相关知识的信息可以在本站进行查询。
本文标签: