Служба REST возвращает неверный тип контента и отменяет маршалинг - PullRequest
2 голосов
/ 25 марта 2012

Я использую RESTEasy и, более конкретно, клиентскую часть их фреймворка.

Я звоню в стороннюю веб-службу, которая возвращает мне JSON-код.

Но по ряду веских причин тип контента в их ответе - "text / javascript".

Как я могу сказать RESTEasy, что он должен использовать JSON-провайдер (в целях демаршаллинга) для типа контента "text / javascript"?

Возможно ли это?

Мой код:

public interface XClient {  

@GET
@Produces("application/json")
@Path("/api/x.json")
public Movie getMovieInformation(
        @QueryParam("q") String title);
}

Каким может быть решение:

public interface XClient {  

@GET
@Produces("text/javascript")
// Tell somehow to use json provider despite the produces annotation
@Path("/api/x.json")
public Movie getMovieInformation(
        @QueryParam("q") String title);
}

Ответы [ 2 ]

1 голос
/ 19 августа 2012

Я решил с помощью перехватчика, который заменяет тип входящего контента, например:

this.requestFactory.getSuffixInterceptors().registerInterceptor(
    new MediaTypeInterceptor());


static class MediaTypeInterceptor implements ClientExecutionInterceptor {

    @Override
    public ClientResponse execute(ClientExecutionContext ctx) throws Exception {
        ClientResponse response = ctx.proceed();
        String contentType = (String) response.getHeaders().getFirst("Content-Type");
        if (contentType.startsWith("text/javascript")) {
            response.getHeaders().putSingle("Content-Type", "application/json");
        }
        return response;
    }

}
0 голосов
/ 26 марта 2012

У меня заканчивается время, так что мне это удалось. Я пометил ответ от сервера как String, и я вручную обработал демаршалл с Джексоном:

public interface XClient {  

@GET
@Path("/api/x.json")
@Produces(MediaType.APPLICATION_JSON)
public String getMovieInformation(
        @QueryParam("q") String title,

}

и, по моему вызову REST:

MovieRESTAPIClient client = ProxyFactory.create(XClient.class,"http://api.xxx.com");
String json_string = client.getMovieInformation("taken");

ObjectMapper om = new ObjectMapper();
Movie movie = null;
try {
    movie = om.readValue(json_string, Movie.class);
} catch (JsonParseException e) {
myLogger.severe(e.toString());
e.printStackTrace();
} catch (JsonMappingException e) {
myLogger.severe(e.toString());
    e.printStackTrace();
} catch (IOException e) {
    myLogger.severe(e.toString());
    e.printStackTrace();
}

Пожалуйста, сообщите, если это не лучшее решение. Но это похоже на работу.

...