Ошибка Джексона Java EnumMap - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь десериализовать EnumMap с Джексоном, и у меня возникает следующая ошибка:

javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.JsonMappingException: Can not construct EnumMap; generic (key) type not available
 at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@793ff30f; line: 1, column: 1]

Вот перечисление, которое я использую для ключей:

public enum ResultTypeEnum
{
    PRESETS,
    SUMMARY,
    TERMINATION,
    TIMESERIES
}

Код сервера такой:

@GET
    @Path("/results")
    @Produces(MediaType.APPLICATION_JSON)
    public DiagnoticResults getAllResults() {
        try {
            return subjectService.onGetAllResults();

        } catch (IllegalOperationException ex) {
            throw new InternalServerErrorException(ex);
        }
    }

Код клиента:

@SuppressWarnings("unchecked")
    public EnumMap getAllResults() {
        return client.target(subjectURI + "results").request(MediaType.APPLICATION_JSON)
                .get(EnumMap.class);

    }

Класс результатов диагностики:

public class DiagnoticResults extends EnumMap<ResultTypeEnum, byte[]> {

    public DiagnoticResults() {
        super(ResultTypeEnum.class);
    }
}

Это класс, который я написал от другого пользователя, у которого были проблемы с EnumMap.

1 Ответ

0 голосов
/ 14 мая 2018

Мне не удалось воспроизвести вашу проблему, поэтому я немного догадываюсь здесь.

Кажется, у клиентского кода есть проблемы при создании EnumMap<K, V> путем вызова конструктора EnumMap(Class<K>), потому чтонет информации о том, какой тип общего типа K использовать.

Поэтому в вашем клиентском коде вы должны заменить EnumMap на DiagnoticResults.
вместо своего кода

@SuppressWarnings("unchecked")
public EnumMap getAllResults() {
    return client.target(subjectURI + "results").request(MediaType.APPLICATION_JSON)
            .get(EnumMap.class);
}

попробуйте этот код:

public DiagnoticResults getAllResults() {
    return client.target(subjectURI + "results").request(MediaType.APPLICATION_JSON)
            .get(DiagnoticResults.class);
}
...