如何强制在RestEasy客户端中使用特定的MediaType

时间:2014-09-24 12:40:40

标签: json resteasy

我有一个共享API和服务注释

@Produces({"application/json","application/x-jackson-smile"})
@Consumes({"application/json","application/x-jackson-smile"})
public class AServiceClass {

因此默认为JSON - 在使用浏览器AJAX调用时,这将是首选。

但是我有一个使用

创建的RestEasy客户端
ProxyFactory.create(AServiceClass.class, url)

我希望这个客户端使用SMILE进行入站和出站通信。当然,它从@Consumes中选择第一项并尝试编组到JSON。

我正在使用RestEasy 2.3.5

如何强制客户端使用SMILE编组?

如何强制客户端接受SMILE而不是JSON?

3 个答案:

答案 0 :(得分:1)

实际上事实证明你(我的意思是:-))不能这样做

检查MediaTypeHelper.getConsumes()表示选择第一个注释值以确定编组媒体类型。

return MediaType.valueOf(consume.value()[0]);

在确定接受标头时会发生同样的情况。该代码使用MediaTypeHelper.getProduces()

答案 1 :(得分:0)

可以通过指定标题Accept

的值来完成
             Response response = client.target(host + "/yourpath").request()
                 .header(HttpHeaders.ACCEPT, "application/x-jackson-smile")
                 .get();

答案 2 :(得分:0)

您也可以使用ClientRequestFilter来实现这一点,如果您使用的是JAX-RS注释类的代理,那么这样做会更加有用。例如

public class AcceptedHeaderFilter implements ClientRequestFilter
{
    private final MediaType acceptedType;

    public AcceptedHeaderFilter(final MediaType acceptedType)
    {
        super();
        this.acceptedType = acceptedType;
    }

    @Override
    public void filter(final ClientRequestContext requestContext) throws IOException
    {
        requestContext.getHeaders().get(HttpHeaders.ACCEPT).clear();
        requestContext.getHeaders().get(HttpHeaders.ACCEPT).add(acceptedType.toString());
    }

}

如果您使用Resteasy,则可以在ResteasyWebTarget上注册

MediaType contentType = MediaType.APPLICATION_XML_TYPE;
final ResteasyWebTarget target = buildTarget();
target.getResteasyClient().register(new AcceptedHeaderFilter(contentType));

CXF或Jersey允许您注册过滤器,但要求您以稍有不同的方式进行过滤。