Я пытаюсь создать фасад для получения списка с сервера, но ему не удается правильно преобразовать GenericType в список, и поэтому он не может выполнить цикл ForLoop, не выдав следующее исключение: java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.testing.models.Account
Это связано с отсутствием достаточной информации о том, в какой класс десериализоваться, поэтому вместо этого он использует LinkedHashMap.Что я на самом деле хочу, так это List.
Обратите внимание, что getInbox не использует суперкласс и не использует generic, T, и это работает.
public abstract class BaseClient<T> {
final String BaseURI = "http://localhost:8082/r";
final Client client;
BaseClient() {
ClientConfig clientConfig = new ClientConfig();
clientConfig.property(LoggingFeature.LOGGING_FEATURE_VERBOSITY_CLIENT, LoggingFeature.Verbosity.PAYLOAD_ANY);
client = ClientBuilder.newClient(clientConfig);
}
@Deprecated // Does not map properly to List<T>
public List<T> getList(String target, String path, String format) {
List<T> list = client.target(target)
.path(path)
.request(format)
.get(new GenericType<List<T>>(){});
return list;
}
public void close() {
client.close();
}
}
public class MessagesClient extends BaseClient<Message> {
public static final String ClassURI = "/messages";
public MessagesClient() {
super();
}
public void insert(Message message) {
super.post(message, BaseURI + ClassURI, "/create/", MediaType.APPLICATION_JSON);
}
public void delete(Message message) {
super.post(message, BaseURI + ClassURI, "/delete/", MediaType.APPLICATION_JSON);
}
public List<Message> getInbox(String username) throws Exception {
// I want to replace this with a call to the facade as seen in the examples above.
// (This is currently working)
return client.target(BaseURI + ClassURI)
.path("/inbox/" + username + "/")
.request(MediaType.APPLICATION_JSON)
.get(new GenericType<List<Message>>(){});
}
}
Вопрос: почему фасад не работает, если другой не использует дженерики?