我有一个共享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?
答案 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允许您注册过滤器,但要求您以稍有不同的方式进行过滤。