2017-09-25 8 views
0

私たちは奇妙な問題に直面しています。何が起こっているのか理解していないし、他の誰かがすでに同じ問題を抱えていて、spring boot @Cachable null値でいっぱいのスーパークラスのすべてのフィールドを返す

我々は@Cachableを利用して、簡単なRESTサービスを書いた:

@GetMapping(value = "/get/{" + PARAM_TENANT + "}/{" + PARAM_UID + "}") 
@Cacheable(value = GET_ORDERS_BY_UID) 
public GetOrdersResponseDto getOrdersByUid(@PathVariable final String tenant, @PathVariable final String uid) { 
     .... 
     return new GetOrdersResponseDto(createCacheKey(), orderResponseDtos); 
} 

GetOrdersResponseDtoは、いくつかのフィールドで構成されています。カスタムクラスのインスタンス、それらのリスト、その他の単純なプリミティブ値が含まれているものもあります。

キャッシュからGetOrdersResponseDtoレスポンスが提供されると、リスト内に格納され、オブジェクトスーパークラスに格納されているオブジェクトのすべてのフィールドがNULL値で埋められます。

私たちはキャッシュの実装としてヘイゼルキャストを使用しています。次のように

@Component 
public class HazelcastConfig extends Config { 

@Autowired 
public HazelcastConfig(final ConfigClient configClient) { 
    super(); 

    final GroupConfig groupConfig = getGroupConfig(); 
    final String name = configClient 
     .getConfigPropertyValueOrThrow("public", "com.orderservice.hazelcast.group.name"); 
    groupConfig.setName("foogroup"); 

    final String password = configClient 
     .getConfigPropertyValueOrThrow("public", "com.orderservice.hazelcast.group.password"); 
    groupConfig.setPassword(password); 

レスポンスクラスが見えます:

public class GetOrdersResponseDto implements Serializable { 

    private String cacheSerial; 

    private List<OrderResponseDto> orderResponseDtos; 

} 

と問題がOrderResponseDtoのスーパークラスの一部であるOrderResponseDtoのフィールドに対してのみ発生し、当社のキャッシュ設定は非常に基本的です。

私はこの奇妙な行動の原因を誰かに知らせることができますか?

編集:私は、これは、Javaの動作です

+0

GetOrdersResponseDtoクラスも共有できますか?そして、 '問題はリスト内に格納されているオブジェクトに対してのみ発生します。 'ということはどういう意味ですか? –

+0

コードを追加して物事を明確にしようとしました。私たちが使用しているdtosの(共有された)スーパークラスの使用を取り除くことでした... – xstring

+0

@xstringこれはあなたが元々望んでいた方法でこれまで作業しましたか? ( 'GetOrdersResponseDto'は他のオブジェクトのリストを含んでいます)。これはうまくいくはずですが、そうでない場合は、もう少しサンプルがあれば問題の特定に役立ちます。 'GetOrdersResponseDto'は' Serializable'なので、その中にあるものはすべて –

答えて

1

...問題がリスト内に格納されているオブジェクトのために発生することが、分かりました。 https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html

オブジェクトがシリアライズ可能であり、シリアライズ可能でないオブジェクトを拡張している場合は、NotSerializeExceptionの代わりに親オブジェクトのフィールドが初期化されているだけなので、それらをヌルにします。

これは単体テストで証明できます。 再利用するには - https://github.com/hazelcast/hazelcast-code-samples/blob/master/serialization/hazelcast-airlines/the-code/src/test/java/com/hazelcast/samples/serialization/hazelcast/airlines/V1FlightTest.java

+0

である必要があります。 – xstring

+0

あなたは大歓迎です!最終的には明白でしたが、見つけるのにはしばらく時間がかかりました。 –

関連する問題