Eu tenho tentado criar um simples WebService Restful, usando o NetBeans Ide.
Minha versão do Java EE é: Java EE 7 Web.
Eu criei um novo Java Web Application, definindo este ContexPath: /DukesAgeService
.
Agora, executando meu aplicativo, o navegador exibe minha página Index.html
em:
http://localhost:8080/DukesAgeService/
então tudo funciona bem.
Em seguida, tentei criar um recurso repousante simples usando o Assistente de serviço da Web RESTful.
Então, criei esta class:
package firstcup.webservice; import javax.ws.rs.core.Context; import javax.ws.rs.core.UriInfo; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.Consumes; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PUT; /** * REST Web Service * * @author nolanof */ @Path("dukesAge") public class DukesAgeResource { @Context private UriInfo context; /** * Creates a new instance of DukesAgeResource */ public DukesAgeResource() { } /** * Retrieves representation of an instance of firstcup.webservice.DukesAgeResource * @return an instance of java.lang.String */ @GET @Produces("text/plain") public String getText() { return "hello world"; } }
Mas executando o meu aplicativo, na url: http://localhost:8080/DukesAgeService/dukesAge
eu recebo uma página 404 não encontrada.
Eu expliquei que qualquer solicitação get de input que tenha o url de "/dukesAge"
foi manipulada pelo método getText
class getText
. O que está errado?
obrigado
Você provavelmente está perdendo o servlet do aplicativo JAX-RS. Você pode defini-lo no web.xml
ou, se quiser ir xml-less, pode usar uma subclass Application
. A maneira mais fácil é simplesmente usar a subclass Application
anotada com @ApplicationPath
. Um servlet será criado e o caminho do servlet será definido no valor da anotação. Algo como
@ApplicationPath("/rest") public class RestApplication extends Application { // All request scoped resources and providers @Override public Set> getClasses() { Set> classs = new HashSet<>(); classes.add(DukesAgeResource.class); return classes; } // all singleton resources and providers @Override public Set
Então o recurso deve acessar o recurso via
http://localhost:8080/DukesAgeService/rest/dukesAge
.
Existem outras maneiras, mas esta é a maneira portátil. O Glassfish usa Jersey, mas a criação de um aplicativo da Web Java EE a partir do zero no Netbeans só importará classs padrão do Java EE de tempo de compilation (sem dependencies Jersey). Então, o acima é realmente sua aposta para começar.
Você pode ver outras opções de implantação na Documentação de Jersey . Para algumas das opções, você pode precisar adicionar algumas dependencies de tempo de compilation de Jersey. É por isso que acabei de mencionar o acima. Nenhum outro flask é necessário.
Outra coisa que causaria um erro 404 seria se você especificasse o caminho do servlet JAX-RS como /*
. Isso entrará em conflito com o servlet padrão que serve os resources estáticos, como suas páginas html. É por isso que eu configuro para /rest
.
ATUALIZAR
Também é declarado na especificação JAX-RS que, se houver conjuntos vazios retornados em getClasses()
e getSingletons()
, a varredura de pacote implícita deve ocorrer. (provedor) As classs anotadas com @Provider
serão adicionadas por padrão como singletons e as classs de recurso anotadas com @Path
serão objects por requisição (significando que um novo object é criado em cada requisição). Então você poderia alternativamente apenas ter
@ApplicationPath("/rest") public class RestApplication extends Application { // Left empty }
E isso deve funcionar da mesma forma.
Você pode ter inicializado algum caminho em seu web.xml, provavelmente é por isso que você está recebendo um erro 404 enquanto liga para o serviço. Verifique seu web.xml e, caso ele esteja configurado para qualquer coisa, em vez disso *, por favor, anexe-o à sua chamada de serviço para que ele funcione.