对于想了解Jackson2和SpringAutowiredbean的读者,本文将提供新的信息,并且为您提供关于@Autowire从外部jar创建的springbean?、android–使用RoboS
对于想了解Jackson2和Spring Autowired bean的读者,本文将提供新的信息,并且为您提供关于@Autowire从外部jar创建的spring bean?、android – 使用RoboSpice与Jackson2和Spring、Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: pri...、java – Jackson 2和Spring Autowired bean的有价值信息。
本文目录一览:- Jackson2和Spring Autowired bean
- @Autowire从外部jar创建的spring bean?
- android – 使用RoboSpice与Jackson2和Spring
- Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: pri...
- java – Jackson 2和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对象:
@Autowiredprivate 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; }}
答案1
小编典典由于您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);
@Autowire从外部jar创建的spring bean?
我有一个已创建的模块/ jar,正在用作util 库。我在那里创建了一个服务,如下所示:
@Servicepublic class PermissionsService { ... }
…它位于以下包中的位置:com.inin.architect.permissions和我的主应用程序中,我正在引用/加载此jar(即,设置为该应用程序的Maven POM.xml文件中的依赖项),例如所以:
<dependency> <groupId>com.inin.architect</groupId> <artifactId>permissions</artifactId> <version>1.0-SNAPSHOT</version> </dependency>
在应用程序中,我想使用该服务,例如:
@AutowiredPermissionsService permissions
在应用程序的spring设置中,我得到了以下信息:
@Configuration@EnableWebMvc@ComponentScan(basePackages = { "com.inin.generator", "com.inin.architect.permissions" })public class WebConfig extends WebMvcConfigurerAdapter implements ServletContextAware { }
但是,当我在tomcat下运行我的应用程序时,它抱怨没有PermissionsService的bean :“ org.springframework.beans.factory.NoSuchBeanDefinitionException:没有合格的bean类型……”
那么,如何将bean从lib引入到我的应用程序中呢?当然有办法。你是否必须将库设置为完整的Spring MVC应用程序,这样才能正常工作?即你是否也必须在lib中安装@Configuration和@ComponentScan?
答案1
小编典典你必须至少扫描包含要注入的类的软件包。例如,使用Spring 4注释:
@Configuration@ComponentScan("com.package.where.my.class.is")class Config {...}
这与XML配置的原理相同。
android – 使用RoboSpice与Jackson2和Spring
我的libs文件夹包含以下jar.
> commons-io-1.3.2.jar
> commons-lang3-3.2.1.jar
> jackson-annotations-2.2.3.jar
> jackson-core-2.2.3.jar
> jackson-databind-2.2.3.jar
> robospice-1.4.11.jar
> robospice-cache-1.4.11.jar
> robospice-spring-android-1.4.11.jar
> spring-android-core-1.0.1.RELEASE.jar
> spring-android-rest-template-1.0.1.RELEASE.jar
如果写了here,如果找到jackson2 jar,SpringAndroidSpiceService将切换到jackson2.
应用程序因此异常而崩溃:
java.lang.NoClassDefFoundError: org.codehaus.jackson.map.ObjectMapper at org.springframework.http.converter.json.MappingJacksonHttpMessageConverter.<init>(MappingJacksonHttpMessageConverter.java:54) at com.octo.android.robospice.JacksonspringAndroidSpiceService.createRestTemplate(JacksonspringAndroidSpiceService.java:33) at com.octo.android.robospice.SpringAndroidSpiceService.onCreate(SpringAndroidSpiceService.java:26) at android.app.ActivityThread.handleCreateService(ActivityThread.java:2572) at android.app.ActivityThread.access$1800(ActivityThread.java:135) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
我错过了什么?
解决方法
Jackson2SpringAndroidSpiceService
而不是JacksonspringAndroidSpiceService. 2件事:)
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 中加载进去即可。
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);
我们今天的关于Jackson2和Spring Autowired bean的分享已经告一段落,感谢您的关注,如果您想了解更多关于@Autowire从外部jar创建的spring bean?、android – 使用RoboSpice与Jackson2和Spring、Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: pri...、java – Jackson 2和Spring Autowired bean的相关信息,请在本站查询。
本文标签: