C'est la première fois que je traite avec des services Web. Simplement, je dois envoyer une demande de publication d'un client de service Web jersey (dans une page Web mise en œuvre en javascript) à un service jersey qui se trouve dans l'un de mes modules maven.
Comme je l'ai dit, j'ai créé jersey-server dans l'un de mes modules maven et j'aimerais le lancer d'une manière ou d'une autre (je ne sais pas comment exécuter un programme de service Web.) Avant de commencer le côté client de mon implémentation. En cherchant sur le Web, j'ai vu beaucoup d'exemples, mais tous utilisaient Tomcat. Ma première question est donc la suivante: dois-je utiliser Tomcat (ou quelque chose du genre) pour exécuter un service Web? Deuxièmement, ci-dessous, j'ai partagé mon module jersey-server. Comment pourrais-je commencer à l'exécuter?
package com.exampleProject.rest;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import Java.util.List;
@Path("/test")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public class SiderRecommender {
@POST
@Path("/functiontest")
public List<Recommendation> sampleFunction() {
// return something here. I removed it for simplicity.
}
}
Vous n'avez pas {avez} _ pour exécuter une application Jersey sur un serveur Web installé. Vous pouvez l'exécuter sur un serveur embedded}, ce qui signifie un serveur qui s'exécute en mode autonome avec une méthode main
normale.
Si vous utilisez Maven et que vous maîtrisez la création d'archétypes Maven, vous pouvez utiliser l'archétype jersey-quickstart-grizzly2
.
jersey-quickstart-grizzly2
) jersey-quickstart-grizzly2
).C'est tout ce que vous obtenez gratuitement avec le projet archétype.
Main.Java
package com.underdog.jersey.grizzly;
import org.glassfish.grizzly.http.server.HttpServer;
import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
import org.glassfish.jersey.server.ResourceConfig;
import Java.io.IOException;
import Java.net.URI;
/**
* Main class.
*
*/
public class Main {
// Base URI the Grizzly HTTP server will listen on
public static final String BASE_URI = "http://localhost:8080/myapp/";
/**
* Starts Grizzly HTTP server exposing JAX-RS resources defined in this application.
* @return Grizzly HTTP server.
*/
public static HttpServer startServer() {
// create a resource config that scans for JAX-RS resources and providers
// in com.underdog.jersey.grizzly package
final ResourceConfig rc = new ResourceConfig().packages("com.underdog.jersey.grizzly");
// create and start a new instance of grizzly http server
// exposing the Jersey application at BASE_URI
return GrizzlyHttpServerFactory.createHttpServer(URI.create(BASE_URI), rc);
}
/**
* Main method.
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
final HttpServer server = startServer();
System.out.println(String.format("Jersey app started with WADL available at "
+ "%sapplication.wadl\nHit enter to stop it...", BASE_URI));
System.in.read();
server.stop();
}
}
MyResource.Java
package com.underdog.jersey.grizzly;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
/**
* Root resource (exposed at "myresource" path)
*/
@Path("myresource")
public class MyResource {
/**
* Method handling HTTP GET requests. The returned object will be sent
* to the client as "text/plain" media type.
*
* @return String that will be returned as a text/plain response.
*/
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getIt() {
return "Got it!";
}
}
MyResourceTest.Java
package com.underdog.jersey.grizzly;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import org.glassfish.grizzly.http.server.HttpServer;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
public class MyResourceTest {
private HttpServer server;
private WebTarget target;
@Before
public void setUp() throws Exception {
// start the server
server = Main.startServer();
// create the client
Client c = ClientBuilder.newClient();
// uncomment the following line if you want to enable
// support for JSON in the client (you also have to uncomment
// dependency on jersey-media-json module in pom.xml and Main.startServer())
// --
// c.configuration().enable(new org.glassfish.jersey.media.json.JsonJaxbFeature());
target = c.target(Main.BASE_URI);
}
@After
public void tearDown() throws Exception {
server.stop();
}
/**
* Test to see that the message "Got it!" is sent in the response.
*/
@Test
public void testGetIt() {
String responseMsg = target.path("myresource").request().get(String.class);
assertEquals("Got it!", responseMsg);
}
}
pom.xml
- J'ai ajouté le jersey-media-json-jackson
et le maven-Assembly-plugin
moi-même, de sorte que vous puissiez créer un seul fichier jar exécutable.
<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.underdog</groupId>
<artifactId>jersey-grizzly</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>jersey-grizzly</name>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey</groupId>
<artifactId>jersey-bom</artifactId>
<version>${jersey.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<artifactId>maven-Assembly-plugin</artifactId>
<version>2.5.3</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>com.underdog.jersey.grizzly.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>create-archive</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<inherited>true</inherited>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<executions>
<execution>
<goals>
<goal>Java</goal>
</goals>
</execution>
</executions>
<configuration>
<mainClass>com.underdog.jersey.grizzly.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
<properties>
<jersey.version>2.17</jersey.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
Avec tout ce qui précède, vous pouvez cd
dans le projet à partir de la ligne de commande et
mvn clean package
Java -jar target/jersey-grizzly-jar-with-dependencies.jar
et l'application va commencer.
Vous pouvez y accéder à partir de http://localhost:8080/myapp/myresource
C'est tout. Notez que ce qui précède est un projet JAR normal. Donc, si vous ne pouvez pas suivre la création de l'archétype, vous pouvez pratiquement tout copier dans un projet jar.
Voir également:
Je ne peux pas commenter la première réponse. J'ajoute donc un commentaire ici. Si vous choisissez de générer le projet avec l'archétype, la ligne de commande doit être
mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-grizzly2 -DarchetypeGroupId=org.glassfish.jersey.archetypes -DinteractiveMode=false -DgroupId=com.underdog.jersey.grizzly -DartifactId=simple-service -Dpackage=com.underdog.jersey.grizzly -DarchetypeVersion=2.23.1
Et pas la ligne de commande dans le link . Cela fonctionnera avec le pom fourni par peeskillet