Java 如何使用JAX-RS标准客户端API处理来自web服务的错误JSON内容类型?

Java 如何使用JAX-RS标准客户端API处理来自web服务的错误JSON内容类型?,java,json,web-services,jax-rs,rotten-tomatoes,Java,Json,Web Services,Jax Rs,Rotten Tomatoes,我想使用烂番茄API来搜索电影 我有一个等效的完全工作的应用程序,它使用TMDB而不是烂番茄 我使用JBoss RESTEasy和RESTEasy Jackson2提供程序提供的标准JAX-RS客户端(当然我不能发布API密钥): MovieSearchResults类只是一个JAXB注释类,用于绑定JSON 最直接的问题是,Rotter Tomatos API为其所有JSON响应返回一个内容类型为“text/javascript”的响应。尽管返回JSON时设置的内容类型显然是错误的,但他们不愿

我想使用烂番茄API来搜索电影

我有一个等效的完全工作的应用程序,它使用TMDB而不是烂番茄

我使用JBoss RESTEasy和RESTEasy Jackson2提供程序提供的标准JAX-RS客户端(当然我不能发布API密钥):

MovieSearchResults类只是一个JAXB注释类,用于绑定JSON

最直接的问题是,Rotter Tomatos API为其所有JSON响应返回一个内容类型为“text/javascript”的响应。尽管返回JSON时设置的内容类型显然是错误的,但他们不愿意更改他们的服务,所以现在就是这样

我调用服务时遇到的异常是:

线程“main”中出现异常 javax.ws.rs.client.ResponseProcessingException: javax.ws.rs.ProcessingException: 找不到的MessageBodyReader 内容类型text/javascript;字符集=ISO-8859-1和类型类MovieSearchResults 所以问题是:有没有一种简单的方法来获取/配置标准JAX-RS客户机,以便将返回的“text/javascript”内容类型识别为“application/json”


它们类似,但公认的答案似乎使用JBoss特定的API,我只想通过JAX-RS客户端API来实现这一点。

答案是使用JAX-RS ClientResponseFilter

请求更改为注册筛选器:

public MovieSearchResults search(String query) {
    return client
        .register(JsonContentTypeResponseFilter.class)
        .target("http://api.rottentomatoes.com/api/public/v1.0/movies.json")
        .queryParam("apikey", API_KEY)
        .queryParam("q", query)
        .request(MediaType.APPLICATION_JSON)
        .get(MovieSearchResults.class);
}
过滤器本身仅替换内容类型标题:

public class JsonContentTypeResponseFilter implements ClientResponseFilter {

    @Override
    public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
        List<String> contentType = new ArrayList<>(1);
        contentType.add(MediaType.APPLICATION_JSON);
        responseContext.getHeaders().put("Content-Type", contentType);
    }
}
公共类JsonContentTypeResponseFilter实现ClientResponseFilter{
@凌驾
公共无效筛选器(ClientRequestContext requestContext、ClientResponseContext responseContext responseContext)引发IOException{
列表内容类型=新的ArrayList(1);
contentType.add(MediaType.APPLICATION_JSON);
responseContext.getHeaders().put(“内容类型”,contentType);
}
}
public class JsonContentTypeResponseFilter implements ClientResponseFilter {

    @Override
    public void filter(ClientRequestContext requestContext, ClientResponseContext responseContext) throws IOException {
        List<String> contentType = new ArrayList<>(1);
        contentType.add(MediaType.APPLICATION_JSON);
        responseContext.getHeaders().put("Content-Type", contentType);
    }
}