Spring 3.x@ResponseBody
を使用して json/xml 応答を生成しようとしています。多対多のリレーション b/w テーブルがあり、json が LazyInitializationException をスローしているときに JPA 2.0 ORM を使用しています。
「eager fetch」を指定すると、循環参照になります。
Spring 3.x@ResponseBody
を使用して json/xml 応答を生成しようとしています。多対多のリレーション b/w テーブルがあり、json が LazyInitializationException をスローしているときに JPA 2.0 ORM を使用しています。
「eager fetch」を指定すると、循環参照になります。
私は最近、同様の問題に遭遇しました:ジャクソン - 二項関係を持つエンティティのシリアル化 (サイクルの回避)
したがって、解決策は、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
これに基づいています:
ただし、Jackson 1.* の代わりに、Jackson 2.0 の ObjectMapper およびその他の Jackson クラスを使用してください。
あなたのコメントから判断すると、カスタムを作成するだけ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" />
ORM で管理されたオブジェクトを JSON にシリアライズしているように聞こえますがLazyInitializationException
、Controller が DB 接続へのハンドルを持っていないため、すべての子関連付けを初期化しておらず、. 2 つの選択肢: