5

Spring 3.x@ResponseBodyを使用して json/xml 応答を生成しようとしています。多対多のリレーション b/w テーブルがあり、json が LazyInitializationException をスローしているときに JPA 2.0 ORM を使用しています。

「eager fetch」を指定すると、循環参照になります。

4

3 に答える 3

3

私は最近、同様の問題に遭遇しました:ジャクソン - 二項関係を持つエンティティのシリアル化 (サイクルの回避)

したがって、解決策は、Jackson 2.0 にアップグレードし、クラスに次の注釈を追加することです。

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, 
                  property = "@id")
public class SomeEntityClass ...

問題は、Spring が Jackson 2.0 で動作しないことです。これは、次の方法で解決されました。

<bean id="jacksonMessageConverter"
          class="own.implementation.of.MappingJacksonHttpMessageConverter"/>

<bean class="org.springframework.web.servlet.mvc
             .annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <list>
                <ref bean="jacksonMessageConverter"/>
            </list>
        </property>
        <property name="requireSession" value="false"/>
    </bean>

そしてown.implementation.of.MappingJacksonHttpMessageConverterこれに基づいています:

http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter /json/MappingJacksonHttpMessageConverter.java?format=ok

ただし、Jackson 1.* の代わりに、Jackson 2.0 の ObjectMapper およびその他の Jackson クラスを使用してください。

于 2012-04-10T16:14:50.177 に答える
3

あなたのコメントから判断すると、カスタムを作成するだけSerializerです。

あなたのJsonSerializer。シリアル化しようとしているオブジェクトの種類ごとにこれらを使用できます。

public class MyObjectJsonSerializer extends JsonSerializer<MyObject> {

@Override
public Class<MyObject> handledType() {
    return MyObject.class;
}

@Override
public void serialize(MyObject myObject, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException {
    jgen.writeStartObject();
    jgen.writeNumberField("id", myObject.getId());
    // whatever else you need
    jgen.writeEndObject();
}

}

あなたのObjectMapper

public class MyObjectMapper extends ObjectMapper {

public MyObjectMapper() {
    SimpleModule module = new SimpleModule("My Module", new Version(1, 0, 0, "SNAPSHOT"));
    module.addSerializer(new MyObjectJsonSerializer());

    this.registerModule(module);
}

}

そして、spring-config.xml で。

<mvc:annotation-driven>
    <mvc:message-converters>
        <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
            <property name="objectMapper" ref="myObjectMapper" />
        </bean>
    </mvc:message-converters>
</mvc:annotation-driven>

<bean id="myObjectMapper" class="com.manne.app.objectmapper.MyObjectMapper" />
于 2012-03-21T14:09:12.060 に答える
1

ORM で管理されたオブジェクトを JSON にシリアライズしているように聞こえますがLazyInitializationException、Controller が DB 接続へのハンドルを持っていないため、すべての子関連付けを初期化しておらず、. 2 つの選択肢:

  1. DAO レイヤーでオブジェクトのすべての子関連付けを初期化します
  2. ORM 管理オブジェクトを TO に変換し、それをコントローラーに渡して JSON に変換します
于 2012-03-18T14:39:14.083 に答える