Вернуть HashMap из Corda Flow в SpringBoot, сгенерированные - PullRequest
0 голосов
/ 05 октября 2018

Я использую сервис, который получает данные из FLow. Возвращаемым типом вызова () является HashMap. При вызове APi я получаю следующее исключение.Я читал, что HashMap не входит в белый список. Может кто-нибудь подсказать, как вернуть Map или ConcurrentHashMap из потока Corda в службу.

"com.esotericsoftware.kryo.KryoException: класс java.util.HashMap не аннотирован и не включен в белый список, поэтому его нельзя использовать при сериализации \ nСериализация трассировки: \ nvalue (rx.Notification)",

Некоторые фрагменты кода:

    @Suspendable
    @Override
    public Map<Party, StateAndRef<MembershipState>> call() throws FlowException {

        MembershipsCacheHolder membershipService = getServiceHub().cordaService(MembershipsCacheHolder.class);

        MembershipsCache cache = membershipService.getCache();

        Instant now = getServiceHub().getClock().instant();
        System.out.println("==========started the Get membership flow " + forceRefresh + "cahce" + cache);
        if (forceRefresh || cache == null || cache.getExpires() == null || cache.getExpires().isBefore(now)) {
            MemberConfigurationService configuration = getServiceHub().cordaService(MemberConfigurationService.class);
            Party bno = configuration.bnoParty();
            FlowSession bnoSession = initiateFlow(bno);

            UntrustworthyData<MembershipsListResponse> packet2 = bnoSession.sendAndReceive(MembershipsListResponse.class, new MembershipListRequest());
            MembershipsListResponse response = packet2.unwrap(data -> {
                // Perform checking on the object received.
                // T O D O: Check the received object.
                // Return the object.
                return data;
            });
            try {
                MembershipsCache newCache = MembershipsCache.from(response);
                membershipService.setCache(newCache);
            } catch (Exception e) {
                System.out.println("==========failed the Get membership flow " + forceRefresh + "cahce" + cache);

                e.printStackTrace();
            }


            Map<Party, StateAndRef<MembershipState>> hashMap = new HashMap<Party, StateAndRef<MembershipState>>(membershipService.getCache().getMembershipMap());

            return hashMap;


        } else {

            Map<Party, StateAndRef<MembershipState>> hashMap = new HashMap<Party, StateAndRef<MembershipState>>(cache.getMembershipMap());


            return hashMap;

        }


    }


}

}

И код со стороны загрузочной пружины:

@GetMapping(value = "getMemberShips", produces = MediaType.APPLICATION_JSON_VALUE)
public String getMembership() throws InterruptedException,JsonProcessingException , ExecutionException{

    FlowProgressHandle<Map<Party, StateAndRef<MembershipState>> > flowHandle = proxy.startTrackedFlowDynamic(GetMembershipsFlow.GetMembershipsFlowInitiator.class,true);
    flowHandle.getProgress().subscribe(evt -> System.out.printf(">> %s\n", evt));

    final Map<Party, StateAndRef<MembershipState>>  result = flowHandle
            .getReturnValue()
            .get();

    return result.toString();
}

1 Ответ

0 голосов
/ 05 октября 2018

Как предложено Corda, мы могли бы использовать LinkedHashMap.Работало нормально.Спасибо

...