我可以为这样的jax-rs webservice声明一个接口:
@Path("/foo")
public interface FooRestService {
class Foo {
// DTO-Klasse
}
@GET
@Produces("application/json")
@Path("/list")
List<Foo> list();
}
然后,我可以将此接口用于Web服务实现和客户端代理,如下所示:
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响应自动映射的接口,而不是返回在服务器端键入。有没有办法在接口中指定类型安全返回对象,以便它可以用于服务器实现和客户端代理?