2015-01-24 14 views
5

Ho cercato di creare un semplice servizio Web riposante, utilizzando NetBeans Ide.
La mia versione Java EE è: Java EE 7 Web.Risorsa JAX-RS non trovata nel server GlassFish

Ho creato una nuova applicazione Web Java, impostando questo ContexPath: /DukesAgeService.

Ora, in esecuzione la mia domanda, visualizzazione del browser mia pagina Index.html a:

http://localhost:8080/DukesAgeService/

così, tutto funziona bene.

Quindi, ho provato a creare una risorsa semplice e restful utilizzando la procedura guidata RESTful Web Service.

Così, ho creato questa classe:

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"; 
} 
} 

ma in esecuzione la mia domanda, alla url: http://localhost:8080/DukesAgeService/dukesAge ottengo una pagina 404-non trovato.

Ho verificato che qualsiasi richiesta di ricezione in arrivo con l'url di "/dukesAge" è stata gestita dal metodo classe getText. Cosa c'è che non va?

Grazie

+0

Si prega di inviare il file web.xml pure con la struttura delle cartelle di progetto –

risposta

6

Probabilmente manca il servlet di applicazione JAX-RS. Puoi definirlo nello web.xml o se vuoi andare senza xml, puoi usare una sottoclasse Application. Il modo più semplice per IMO è utilizzare la sottoclasse Application annotata con @ApplicationPath. Verrà creato un servlet e il percorso servlet verrà impostato il valore nell'annotazione. Qualcosa di simile

@ApplicationPath("/rest") 
public class RestApplication extends Application { 
    // All request scoped resources and providers 
    @Override 
    public Set<Class<?>> getClasses() { 
     Set<Class<?>> classes = new HashSet<>(); 
     classes.add(DukesAgeResource.class); 
     return classes; 
    } 

    // all singleton resources and providers 
    @Override 
    public Set<Object> getSingletons() { 
     Set<Object> singletons = new HashSet<>(); 
     return singletons; 
    } 
} 

Poi la risorsa deve essere l'accesso alla risorsa attraverso

http://localhost:8080/DukesAgeService/rest/dukesAge.

Ci sono altri modi, ma questo è il modo portabile. Glassfish utilizza Jersey, ma la creazione di un'applicazione web Java EE da zero in Netbeans importerà solo classi standard Java EE in fase di compilazione (nessuna dipendenza da Jersey). Quindi quanto sopra è davvero la tua scommessa per iniziare.

È possibile visualizzare altre opzioni di implementazione su Jersey Documentation. Per alcune delle opzioni, potrebbe essere necessario aggiungere alcune dipendenze in fase di compilazione di Jersey. Ecco perché ho appena menzionato quanto sopra. Non sono necessari altri barattoli.

Un'altra cosa che causerebbe un 404, è se si specifica il percorso del servlet JAX-RS come /*. Ciò sarà in conflitto con il servlet predefinito che serve le risorse statiche come le pagine html. Ecco perché l'ho impostato su /rest.


UPDATE

Va anche precisato nelle JAX-RS specifica che se ci sono insieme vuoto restituiti nella getClasses() e getSingletons(), dovrebbe verificarsi scansione pacchetto implicito. (fornitore) Le classi annotate con @Provider verranno aggiunte di default come singleton e le classi di risorse annotate con @Path saranno oggetti per richiesta (ovvero ogni nuovo oggetto viene creato). Così si potrebbe in alternativa, basta avere

@ApplicationPath("/rest") 
public class RestApplication extends Application { 
    // Left empty 
} 

e dovrebbe funzionare lo stesso.

+0

hai risolto il mio problema, grazie – nolanofra

+0

@nolanofra thx ho perso così tanto tempo su questo oggi! – Drew

0

Potreste aver inizializzato un certo percorso nel web.xml, probabilmente è per questo che si stanno ottenendo un errore 404, mentre si chiama il servizio. Controlla il tuo web.xml e, nel caso in cui sia impostato su qualsiasi cosa invece di *, per favore aggiungi quella alla tua chiamata di servizio per farlo funzionare.

Problemi correlati