首页 文章

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

提问于
浏览
0

我有一个共享的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

    可以通过指定标头Accept的值来完成

    Response response = client.target(host + "/yourpath").request()
                     .header(HttpHeaders.ACCEPT, "application/x-jackson-smile")
                     .get();
    
  • 0

    事实上,事实证明你(我的意思是我:-)) can't do this .

    检查MediaTypeHelper.getConsumes()表示选择始终 first 注释值以确定编组媒体类型 .

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

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

  • 1

    您也可以使用 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将允许您注册过滤器,但需要您以稍微不同的方式执行此操作 .

相关问题