Как создать объект 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);
Другие вопросы по тегам