GVKun编程网logo

Jackson2和Spring Autowired bean

32

对于想了解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

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?

@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

android – 使用RoboSpice与Jackson2和Spring

我想将Jackson2与 SpringRoboSpice一起使用.
我的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)

我错过了什么?

解决方法

如果你使用Jackson 2,那么你需要使用 Jackson2SpringAndroidSpiceService而不是JacksonspringAndroidSpiceService. 2件事:)

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 中加载进去即可。

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);

我们今天的关于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的相关信息,请在本站查询。

本文标签: