2016-10-10 2 views
1

Я бегу несколько 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); 
} 

Теперь я хочу, чтобы проверить их с помощью Джерси-клиент (или любого другого клиента, если это поможет исправить мою проблему):

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); 

К сожалению, это не сработает. Запрос всегда содержит тип содержимого приложения/json. И это не соответствует интерфейсу на сервере.

В качестве альтернативы я могу создать объект с моим специальным MediaType, который также приводит к ошибке, поскольку он не может найти MessageBodyWriter для этого типа.

О, и я не могу изменить служебную декларацию.

Как вы думаете, а лучший способ проверить этот ресурс?

ответ

1

Создайте объект с вашим специальным MediaType, а затем зарегистрируйте пользовательский MessageBodyWriter с вашим клиентом. Это может быть так же просто, как расширение существующего MessageBodyWrite для возврата true, когда вызывается isWritable, или вам, возможно, придется реализовать метод writeTo.

+0

Спасибо Эндрю. Думайте, что это не слишком плохое решение. – romixch