[SPRING] 잭슨 2 및 봄 Autowired 콩
SPRING잭슨 2 및 봄 Autowired 콩
User 객체에 Jackson 직렬화 문제가 있습니다. getter와 setter가있는 몇 가지 비공개 필드가 있습니다. 그리고 이런 일을 할 때 모든 것이 잘 작동합니다.
public String json() {
MyUser user = new MyUser();
user.setUsername("myName");
return mapper.writeValueAsString(user); // Valid JSON
}
하지만 Spring Framework로 User 객체를 autowire하고 싶습니다.
@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"]
...
autowired MyUser 인스턴스에서 Spring이 잘못 처리 한 것처럼 보이므로 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 관리 빈으로 사용하기 때문에 Spring은 객체를 프록시로 래핑하므로 mapper.writeValueAsString (user); 실제로 프록시를 인수로 전달하고 있습니다. 해당 프록시는 매퍼가 직렬화 할 수없는 몇 가지 속성을 포함합니다.
MyUser를 Spring 관리 빈으로 사용하기 때문에 Spring은 객체를 프록시로 래핑하므로 mapper.writeValueAsString (user); 실제로 프록시를 인수로 전달하고 있습니다. 해당 프록시는 매퍼가 직렬화 할 수없는 몇 가지 속성을 포함합니다.
필요한 속성 만 포함하도록 직렬화 전에 필터를 적용 해보십시오.
ObjectMapper mapper = new ObjectMapper(); SimpleFilterProvider simpleFilterProvider = new SimpleFilterProvider() .addFilter("myUser", simpleBeanPropertyFilter.filterOutAllExcept("username")); mapper.setFilters(filterProvider); return mapper.writeValueAsString(user);
-
==============================
2.이 예외는 UnknownSerializer 클래스에서 발생합니다. 다음은 예외를 throw하는 정확한 코드입니다.
이 예외는 UnknownSerializer 클래스에서 발생합니다. 다음은 예외를 throw하는 정확한 코드입니다.
throw new JsonMappingException("No serializer found for class "+value.getClass().getName() +" and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) )");
오류 메시지는 직렬화 할 수없는 클래스의 이름을 추가합니다. 귀하의 경우, 오류 메시지에 따라 문제는 org.apache.juli.OneLineFormatter 클래스에 있습니다. 따라서 MyUser 클래스에는 문제가 없습니다.
이제이 오류의 원인을 알기 위해 모든 필드가 비공개 인 엔터티를 serialize 할 때 throw됩니다. org.apache.juli.OneLineFormatter 클래스에서 모든 필드는 public getter 및 setter 메소드없이 private입니다.
from https://stackoverflow.com/questions/29371835/jackson-2-and-spring-autowired-bean by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] mysql을 봄 부팅 프로젝트에 연결할 수 없습니다. (0) | 2019.04.26 |
---|---|
[SPRING] Spring Batch - Aws S3의 파일 읽기 (0) | 2019.04.26 |
[SPRING] 여러 개의 InternalResourceViewResolver 만들기 (0) | 2019.04.26 |
[SPRING] 봄 + 메이븐 + 하둡 (0) | 2019.04.25 |
[SPRING] Spring Hibernate가있는 시퀀스에서 다음 값 얻기 (0) | 2019.04.25 |