Я получил предупреждение от 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.