2012-01-02 2 views
2

나는 데이터베이스에서 lazily 콘텐츠를 검색하는 최대 절전 모드를 사용하고 있습니다. 이 내용은 json 출력으로 직렬화됩니다. 문제는 잭슨이 최대 절전 모드에서 가져온 "persistentBag"에서 getters를 호출하고 "세션 없음 또는 세션이 닫혔습니다"예외로 끝나는 것입니다. 사실잭슨 serialise json 제외 형식

내가 잭슨에게하고 싶은이 "목록이로드되지 않은 경우 (그것이 persistentBag을인지 의미) 한 다음에는 직렬화하지 않는다"

이를 달성하는 가장 좋은 방법은 무엇입니까? serialization에서 persistentBag를 제외시키는 jackson 구성은 무엇입니까? 반영 api를 사용하여 persistentBag를 새로운 빈 목록으로 설정해야합니까?

무엇이 최상입니까? 고맙습니다. 그리고 새해 복 많이 받으신 분들께 감사드립니다!

답변

0

@JsonIgnore을 사용하면 표시된 속성을 완전히 무시할 수 있습니다. 현명한 주석 나는 "lodaded 경우"옵션이 있다고 생각하지 않습니다.

물론 할 수있는 것은 유형을 확인하고 진행 방법을 결정하는 자체 마샬 러를 작성하는 것입니다.

다음 몇 가지 주석을 추가하여 해당 유형을 직렬화하는 데 사용되는 사용자 정의 데이터 형식

public class PropertyValueSerializer extends JsonSerializer<PROPERTY_VALUE> { 

    @Override 
    public void serialize(PROPERTY_VALUE property_value, JsonGenerator jsonGenerator, 
          SerializerProvider serializerProvider) throws IOException, JsonProcessingException { 

     jsonGenerator.writeStartObject(); 
     jsonGenerator.writeFieldName(property_value.getKey()); 
     jsonGenerator.writeString(property_value.getValue()); 
     jsonGenerator.writeEndObject(); 
    } 
} 

에 대한 serializer를 작성 : 사용자 정의 직렬 당신에게 완벽하게 제어 할 수 있습니다

@JsonSerialize(using = PropertyValueSerializer.class) 
@JsonDeserialize(using = PropertyValueDeserializer.class) 
public class PROPERTY_VALUE implements Serializable{ 

    private String key; 
    private String value; 

,하지만 좀 더 물론이다 간단한 어노테이션보다 구현이 쉽다.

+0

답장을 보내 주셔서 감사합니다. 만약 내가 잘 이해한다면, 나는 키와 값 속성을 가진 내 자신의 persistentBag를 만들어야 만한다. 최대 절전 모드 persistentBag 대신 데이터베이스 결과 (깊은 해킹없이 가능하다면)에 대한 내 자신을 가져와야합니다. 그런 다음 사용자 지정 마샬 러에서 직렬화 프로세스를 처리하는 방법을 지정할 수 있습니다. – Mostrapotski

+0

내 조정 된 persistentBag를 사용하여 최대 절전 모드를 만드는 방법을 모르기 때문에 반사를 사용하는 것이 쉽지 않을지 궁금합니다. – Mostrapotski

+0

아니요, 영구적 인 가방을 만들지는 않을 것입니다. 그렇기 때문에 영구 가방이있는 유형의 사용자 정의 직렬기를 작성합니다. 액세스 할 수 있고 따라서 직렬화되었는지 여부를 확인할 수 있습니다. –

0

게으른 로딩 처리와 같은 몇 가지 최대 절전 모드 관련 사항에 대한 지원을 추가하기 때문에 처음에는 Jackson Hibernate module을 살펴볼 것입니다. 필요할 경우 콜렉션을 지연로드하는 방법을 이미 알고 있으므로로드되지 않은 콜렉션에 대한 출력을 비활성화 할 수 있도록 확장 할 수도 있습니다.

또한, 일반적으로 당신은 적어도 하나 개의 요소가의 경우에만 일치하는 속성을 추가 할

@JsonSerialize(include=JsonSerialize.Inclusion.NON_EMPTY) 

를 사용하여 빈 컬렉션의 출력을 방지 할 수 있습니다.

+0

이것은 알아두면 좋은 팁이지만 Collection.isEmpty를 반드시 호출해야합니다. 내 최대 절전 모드 세션이 사라지고 예외가 발생하기 때문에이 작업을 원하지 않습니다. 하지만 여전히 알고, 고마워요. – Mostrapotski

+0

좋아. 예, 문제가 될 수 있으므로 한 가지 형태 또는 다른 형태의 공허에 대한 지식이 필요합니다. – StaxMan