Используйте интерфейс reasteasy для клиентского прокси и безопасной реализации сервера - PullRequest
0 голосов
/ 09 мая 2018

Я могу объявить интерфейс для веб-службы 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-ответов, а не в качестве возвращаемого типа на на стороне сервера. Есть ли способ указать типобезопасный возвращаемый объект в интерфейсе, чтобы его можно было использовать как для реализации сервера, так и для клиентского прокси?

...