JAX-RS - Duas classes podem ter o mesmo identificador @Path?

9

Eu tenho um webapp que redireciona para um determinado URI: digamos / service / library . Em outro pacote, eu tenho um servidor jaxrs que ouve / service no URI, e define alguns beans para manipular o pedido. Existem alguns beans lá, e uma das classes já está implementada para lidar com pedidos de / service / library . Eu estou tentando criar uma nova classe que também lida com solicitações para / service / library , mas com um caminho de URI absoluto diferente, por exemplo: / service / library / mynewlibrary . A minha pergunta é: é possível definir o mesmo identificador @Path em duas classes ou devem ser exclusivos, ou seja, eu preciso usar um URI como / service / mylibrary para meu novo implementação de classe em vez de implementar uma segunda classe que também usa o mesmo identificador @Path? Eu sou muito novo no JAX-RS, então espero que minha pergunta faça sentido!

Obrigado!

    
por Stephen 18.04.2011 в 23:30
fonte

3 respostas

4

É possível ter duas anotações de @Path que correspondam ao URI. No seu caso, se o mapeamento de servlet for service , você poderá ter @Path("/library") e @Path("library/mynewlibrary") . Quando a solicitação chega, os caminhos correspondentes são classificados em ordem decrescente, para que a segunda classe seja chamada, quando chegar uma solicitação com /service/library/mynewlibrary .

    
por Tarlog 19.04.2011 / 19:00
fonte
1

É certamente possível ter dois métodos com a mesma anotação @Path , por exemplo, se eles forem diferenciados por outros meios (como o método HTTP ou a anotação @Consumes ). O @Path em uma classe age como um padrão / root para o @Path s nos métodos da classe. Além disso, não é um problema se você tem um caminho que está “dentro” de outro; O JAX-RS especifica que a correspondência mais específica possível é usada. (Eu prefiro não fazer isso dessa maneira, em vez disso, fazer com que a classe "externa" retorne uma referência à classe "interna" em uma correspondência parcial adequada, para que cada caminho tenha uma rota rastreável para a responsabilidade que definitivamente conduz a uma única classe. Isso requer uma maneira bem diferente de organizar as anotações de @Path .)

Mas, se você tiver dois métodos que podem atender à mesma solicitação recebida, você terá um conflito e a implementação do JAX-RS terá a liberdade de escolher qual deles usar (de maneira dependente da implementação) . Isso provavelmente não é o que você quer, já que os computadores tendem a tomar decisões erradas quando recebem uma escolha livre.

    
por Donal Fellows 25.04.2011 / 07:20
fonte
0

Você pode atingir sua meta de ter / service / library / mynewlibrary usando a configuração abaixo.

Em sua classe existente, você tem / service / library configurado no nível de classe para poder configurar / service no nível de classe na nova classe que você está adicionando e então no nível do método configure / library / mynewlibrary.

Desta forma, não terá o mesmo caminho para ambas as classes e o seu objetivo também é alcançado. Eu tentei isso e funciona.

    
por Prakash Boda 19.11.2015 / 12:48
fonte