Можно ли использовать generi c ParameterizedTypeReference для возврата двух разных типов? - PullRequest
0 голосов
/ 14 февраля 2020

Я получил предупреждение от SonarQube с жалобой на дублирующий код, потому что я дублировал метод Apollo для двух разных типов Wrapper, поэтому я начал пытаться удалить этот дубликат, используя метод для возврата обоих типов в переменную и использования его, но я не могу найти способ сделать это.

Дублированный код показан ниже, где «FirstWrapperDto» был заменен «SecondWrapperDto», и оба метода были вызваны где-то еще, чтобы продолжить поток.

private FirstWrapperDto executeApolloQuery(String query, ParameterizedTypeReference<GraphQLResponseDto<FirstWrapperDto>> type) {
        int attemptsAuthentication = 2;
        do {
            try {
                String token = keycloakClient.getAccessToken();
                return apolloClient.executeWithAuthentication(apolloUrl, token, query, type);
            } catch (ApolloException e) {
                LOGGER.info("Exception message", e);
                keycloakClient.generateToken();
                attemptsAuthentication--;
            }
        } while (attemptsAuthentication > 0);

        return null;
    } 

Моя первоначальная идея состояла в том, чтобы создать метод, который вызвал метод с именем getType, и это вернуло бы обобщенную c ParameterizedTypeReference следующим образом:

private ParameterizedTypeReference<GraphQLResponseDto<?>> getType(Object object){
        final ParameterizedTypeReference<GraphQLResponseDto<SecondWrapperDto>> typeSecond= new ParameterizedTypeReference<>() {};
        final ParameterizedTypeReference<GraphQLResponseDto<FirstWrapperDto>> typeFirst= new ParameterizedTypeReference<>() {};

        if(object instanceof SecondWrapperDto){
                        return typeSecond;
        } else if (object instanceof FirstWrapperDto){
                        return typeFirst;
        }
        return null;
    } 

И этот метод быть вызванным в моем третьем методе, который получает WrapperDto от Apollo, следующим образом:

private Object getWrapperDtoFromApollo(String query, Object object){
        int attemptsAuthentication = 2;
        do {
            try {
                String token = keycloakClient.getAccessToken();
                return apolloClient.executeWithAuthentication(apolloUrl, token, query, getType(object));
            } catch (ApolloException e) {
                LOGGER.info("Apollo authenticate error. Requesting a new token...", e);
                keycloakClient.generateToken();
                attemptsAuthentication--;
            }
        } while (attemptsAuthentication > 0);

        return null;
    }

Итак, у меня есть метод, вызывающий executeApolloQuery, который вызывает getWrapperDtoFromApollo, который затем вызывает getType.

проблема в том, что я не могу вернуть разные типы с разными оболочками в GetType.

...