Как создать объект Java из ответа CXF Webclient
Я пишу обертку REST API (скажем, API X) для доступного REST API (скажем, API Y), написанного на Apache CXF. Для оболочки я использую CXF Webclient. Вот как я называю Y из X.
@GET
@Path("{userName}")
public Response getUser(@PathParam("userName") String userName) {
try {
WebClient client
= WebClient.create("https://localhost:8080/um/services/um");
Response response = client.path("users/" + userName)
.accept(MediaType.APPLICATION_JSON)
.get();
User user = (User) response.getEntity();
return Response.ok(user).build();
} catch (Exception e) {
return handleResponse(ResponseStatus.FAILED, e);
}
}
Здесь класс User копируется из Y в X, потому что я не могу использовать Y в качестве зависимости для X. Единственное отличие - это имя пакета. Теперь, когда я отправляю запрос, я получаю исключение приведения класса в User user = (User) response.getEntity();
,
java.lang.ClassCastException: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream cannot be cast to org.comp.rest.api.bean.User
Может быть, потому что имя пакета класса отличается?
Может ли кто-нибудь помочь мне получить ответ на объект пользователя?
3 ответа
Похоже, ваш ответ в формате JSON, верно? Вам необходимо преобразовать поток байтов JSON в ответе в класс Java. Вы пытаетесь привести класс Stream к вашему классу пользователя, который, очевидно, не будет работать. Вам необходимо проанализировать JSON из потока данных и затем десериализовать JSON в свой класс пользователя. Есть библиотеки, которые могут помочь, включая Джексона и GSON
У этого парня простой пример с использованием класса Jackson ObjectMapper - класс ObjectMapper имеет метод readValue, который включает параметр InputStream.
Джексон-провайдер - это решение:
List<Object> providers = new ArrayList<Object>();
providers.add(new JacksonJaxbJsonProvider());
WebClient client = WebClient.create("https://localhost:8080/um/services/um", providers);
User user = client.get(User.class);
Не нужно делать ничего дополнительного.
Если это метод GET
TypeOfObject response = client.path("users/" + userName)
.accept(MediaType.APPLICATION_JSON)
.get(TypeOfObject.class);
Если это метод POST
TypeOfObject response = client.path("users/" + userName)
.accept(MediaType.APPLICATION_JSON)
.post(instatanceOfTypeOfObject, TypeOfObject.class);