使用reasteasy接口进行客户端代理和服务器实现类型安全

时间:2018-05-09 14:28:58

标签: java jax-rs resteasy

我可以为这样的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响应自动映射的接口,而不是返回在服务器端键入。有没有办法在接口中指定类型安全返回对象,以便它可以用于服务器实现和客户端代理?

0 个答案:

没有答案