PDA

Visualizza la versione completa : Errore 404, RESTful Web Service in Java con Jersey...eppure ho seguito la vostra guida!


andbaz
29-01-2020, 00:19
Ciao,

ho seguito la vostra guida https://www.html.it/pag/62521/restful-web-services-in-java-con-jersey-deploy-test-e-oggetti/ ma qualcosa non funziona perché se vado su http://localhost:8080/api/test/e (http://localhost:8080/api/test/andrea)leonora mi ritorna 404.

ATTENZIONE: giorni fa ero riuscito a farlo funzionare in seguito ad una modifica della riga di codice package(... in ExampleApplication.java ma ora non riesco più a farlo funzionare in seguito a delle modifiche.

Ho provato con tutti i possibili package, ma niente: può essere che sbagli di nuovo qui?
Uso Netbeans come IDE, come posso trovare il package sottoforma di stringa da inserire in quel metodo?

Di seguito incollo il codice:

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.company</groupId>
<artifactId>affittagram</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>Affittagram</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>javax.ws.rs-api</artifactId>
<version>2.0.1</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-agroal</artifactId>
<version>5.3.15.Final</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.23.2</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.23.2</version>
</dependency>
</dependencies>
<build>
<finalName>Affittagram</finalName>
<plugins>
<plugin>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-maven-plugin</artifactId>
<version>9.4.26.v20200117</version>
<configuration>
<scanIntervalSeconds>10</scanIntervalSeconds>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.3</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.5.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>


ExampleApplication.java


import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;


@ApplicationPath("api")
public class ExampleApplication extends ResourceConfig {
public ExampleApplication() {
packages("com.company.affittagram");
}
}


Test.java


import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;


@Path("test")
public class Test {


@GET
@Path("{name}")
public String test(@PathParam("name") String name) {
return "Ciao " + name.toUpperCase();
}


}

andbin
29-01-2020, 10:27
Chiariamo subito una cosa. Se applichi la seguente struttura del progetto:

una_qualunque_directory\
affittagram\
pom.xml
src\
main\
java\
com\
company\
affittagram\
ExampleApplication.java
Test.java



E nei due sorgenti Java metti all'inizio la dichiarazione

package com.company.affittagram;

Allora se da prompt da affittagram\ lanci (presupponendo che JDK e Maven siano ok):

mvn jetty:run

poi l'url http://localhost:8080/api/test/eleonora funziona correttamente (puoi provarlo da un qualunque browser).


Detto questo, nel pom.xml ci sono comunque cose che mi paiono superflue. Ad esempio il hibernate-agroal a che serve nell'esempio? A niente mi pare. Nota: Agroal è un connection pool per i data-source in JDBC.

E sappi che l'utilizzo di ResourceConfig è una cosa specifica di Jersey ed è non-standard rispetto alle specifiche JAX-RS.

andbaz
29-01-2020, 13:48
A dire il vero nell'albero delle directory che hai disegnato tu mi mancano le cartelle com, company e affittagram; infatti nella classe ExampleApplication.java non ho "package com.company.affittagram" perché nel default package, classe figlia della cartella java. Significa che l'argomento del metodo "package("")" debba restare vuoto? Anche vuoto non funziona.

(Hibernate l'ho agiunto per un prossimo utilizzo; l'ho tolto ma non funziona comunque non influiva)

P.S. ho provato a ricreare la struttura delle tue cartelle, quindi da avere sulla prima riga della classe ExampleApplication.java e Test.java "package com.company.affittagram" ma ancora errore 404, non capisco cosa potrei sbagliare!

andbin
29-01-2020, 15:31
A dire il vero nell'albero delle directory che hai disegnato tu mi mancano le cartelle com, company e affittagram; infatti nella classe ExampleApplication.java non ho "package com.company.affittagram" perché nel default package, classe figlia della cartella java. Significa che l'argomento del metodo "package("")" debba restare vuoto? Anche vuoto non funziona.
Primo: nelle web application Java generalmente è sempre bene usare i package.

Secondo: da una mia prova veloce fatta ora, pare che packages(""); funziona, anche spostando le classi nel default package.


P.S. ho provato a ricreare la struttura delle tue cartelle, quindi da avere sulla prima riga della classe ExampleApplication.java e Test.java "package com.company.affittagram" ma ancora errore 404, non capisco cosa potrei sbagliare!
Non vedo/capisco quali difficoltà ci siano. Io, senza usare un IDE (quindi tutto "a mano"), ho preso esattamente il tuo pom.xml senza farci modifiche, ho preso i due sorgenti Java (solo aggiungendo la dichiarazione package) messi nella suddetta struttura e.... mvn jetty:run funziona perfettamente subito.

andbaz
29-01-2020, 16:15
Anche a me funziona l server, cioè se vado su localhost:8080 mi ritorna Hello World, la jsp di default ma se vado su localhost:8080/api/test/andrea mi ritorna 404 anziché "Ciao ANDREA".

Ho addirittura voluto ricreare tutto il progetto da zero ma niente: come potrei debuggare? Non vedo vie d'uscita, resto bloccato qui.

andbaz
29-01-2020, 16:43
TROVATO L'ERRORE, scusa per il tempo che ti ho fatto perdere...
Alla fine era la versione di Java, che dalla 14 l'ho fatta scendere a quella di compilazione nel pom.xml versione 8 e adesso funziona.
Quindi il problema era dovuto alla versione sbagliata di Java, ma perché con la 14 impostata di default su linux non potrebbe funzionare un Restful web service compilato alla versione 8? Vorrei capire meglio l'errore, grazie!!

andbaz
29-01-2020, 16:49
Inoltre con la versione del plugin jetty di maven 9.4.26.v20200117 (ultima) mi ritorna 404, invece quella 9.3.11.v20160721 della guida funziona perché? Non capisco davvero.

P.S. credo sia proprio questo il problema, che non dipenda da Java ne dal mio codice ma dalla versione del plugin di Jetty per Maven.

andbaz
31-01-2020, 20:18
Sono passato a Tomcat come server embedded, però a differenza di Jetty non ricarica il server quano rileva modifiche nel codice e rchiede un file jar precompilato nella cartella target anziché un war.

Alternative simili a Jetty? Tipo un plugin maven che compila un war e non appena rileva delle modifiche ricarica il server?

Grazie!

andbaz
01-02-2020, 15:48
RISOLTO

Dovevo cancellare il file web.xml, che nonostante non servisse al plugin di Jetty per via della configurazione tramite estensione della classe ResourceConfig non lo ingorava. Assurdo!

Loading