Я могу объявить интерфейс для веб-службы jax-rs следующим образом:
@Path("/foo")
public interface FooRestService {
class Foo {
// DTO-Klasse
}
@GET
@Produces("application/json")
@Path("/list")
List<Foo> list();
}
Затем я могу использовать этот интерфейс как для реализации веб-сервиса, так и для клиентского прокси, например:
public class FooRestServiceImpl implements FooRestService {
@Override
public List<Foo> list() {
// ...
}
}
и на клиенте ...
FooRestService service = new ResteasyClientBuilder().build()
.proxy(FooRestService.class);
List<Foo> foos = service.list();
System.out.println(foos);
Однако, если я хочу включить в ответ http-метаданные (коды состояния, заголовки и т. Д.), Я должен извлечь фактический тип возврата нетипичным образом, например:
public class FooRestServiceImpl implements FooRestService {
@Override
public Response list() {
return Response.ok().entity(/* ... */).build();
// ...
}
}
и на клиенте ...
Response response = service.list();
int status = response.getStatus();
final GenericType<List<Foo>> type = new GenericType<List<Foo>>() {};
List<Foo> foos = response.readEntity(type);
Если бы я использовал интерфейс только на стороне клиента, я мог бы использовать Response proxy , например:
@Path("/foo")
public interface FooRestService {
@ResponseObject
interface CustomResponse {
@Status
int status();
@Body
List<Foo> body();
}
@GET
@Produces("application/json")
@Path("/list")
CustomResponse list();
}
Однако я не могу должным образом использовать этот интерфейс для реализации на стороне сервера, поскольку ResponseObject
должен использоваться на стороне клиента только с интерфейсом для автоматического сопоставления из общих HTTP-ответов, а не в качестве возвращаемого типа на на стороне сервера. Есть ли способ указать типобезопасный возвращаемый объект в интерфейсе, чтобы его можно было использовать как для реализации сервера, так и для клиентского прокси?