如何将自定义Content-Type设置为jax-rs客户端?

时间:2016-10-10 20:04:08

标签: java json jax-rs content-type

我正在运行一些声明如下的JAX-RS资源:

public interface MyEntityServiceV2 {
    @PUT
    @Consumes({"application/myentity-v2+json"})
    @Produces({"application/myentity-v2+json"})
    @Path("/{uuid:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}}")
    Response putMyEntity(@PathParam("uuid") String uuid, MyEntityDto myEntity);
}

现在我想使用Jersey-Client(或任何其他客户端,如果它有助于解决我的问题)测试它们:

MyEntityDto dto = new MyEntityDto();
Entity<MyEntityDto> entity = Entity.entity(dto, MediaType.APPLICATION_JSON_TYPE);

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:7001/path/" + UUID.randomUUID().toString());
Invocation.Builder builder = target.request("application/myentity-v2+json");
builder.header("Content-Type", "application/myentity-v2+json");
Response response = builder.put(entity);

不幸的是,这不起作用。请求始终包含application / json的内容类型。这与服务器上的界面不匹配。

作为替代方案,我可以使用我的自定义MediaType创建实体,这也会导致错误,因为它无法找到该类型的MessageBodyWriter。

哦,我无法更改服务声明。

您认为测试此资源的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

使用您的自定义MediaType创建实体,然后向您的客户端注册自定义MessageBodyWriter。它可以像在调用true时将现有MessageBodyWrite扩展为返回isWritable一样简单,或者您可能必须实现writeTo方法。