Podłączenie Jersey do projektu Java EE.

0

Witajcie,

Przeszło mi w tym momencie zrobić REST API. Wyczytałem o JAX-RS i wybrałem implementację Jersey. Dodałem w MVN wersję 2.22.1. Czytam User Guide: https://jersey.java.net/documentation/latest/user-guide.html#d0e3312 , tylko jest jeden problem. Do web.xml dodałem:

<servlet>
        <servlet-name>jersey</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>
                pl.bajos
            </param-value>
        </init-param>
</servlet>

<servlet-mapping>
        <servlet-name>jersey</servlet-name>
        <url-pattern>/*</url-pattern>
</servlet-mapping>

IntelliJ zaznacza mi <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>, że klasa ServletContainernie i paczka servlet nie istnieje. Jak mam skonfigurować web.xml do tej wersji skoro dokumentacja (do tej wersji o_O) podaje złe rozwiązanie...?

pom.xml:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.22.1</version>
</dependency>
1
  1. Z jakiego serwera aplikacji korzystasz? Np. na GlassFishu full-profile masz Jersey od razu dostępne w API JEE i nie trzeba dorzucać specjalnej zależności w pom.xml.
  2. W JAX-RS 2.0 nie musisz dodawać servlet'u w web.xml (chyba, że deployujesz do kontenera servlerów niższego niż 3.0). Zamiast tego lepiej wykorzystać konfigurację za pomocą adnotacji.
0

@margor90, korzystam z Java EE 7 Web Profile SDK i Glassfish 4.1. Co zrobić, żeby IntelliJ mi podpowiadało klasy z ${glassfish.home}/glassfish/modules? Jak określić wersje JAX-RS i kontenera servletów?

2

Na GlassFish 4 masz JAX-RS 2.0 i Servlet 3.1.
Taka zależność może być przydatna (scope provided) dla full-profile:
http://mvnrepository.com/artifact/javax/javaee-api/7.0
Jest dostępna analogiczna dla WebProfile.

0

@margor90, usunąłem z pom.xml takie zależności:

<dependency>
    <groupId>javax</groupId>
    <artifactId>javaee-api</artifactId>
    <version>7.0</version>
</dependency>
<dependency>
    <groupId>javax.persistence</groupId>
    <artifactId>persistence-api</artifactId>
    <version>1.0.2</version>
</dependency>

Do IntelliJ dodałem ścieżkę w Glassfishu {glassfish.home}/glassfish/modules, ale teraz Mejven mi nie chce wyszukać tych bibliotek przy kompilacji. Jak to ustrojstwo naprawić? Chciałbym uruchomić chociaż tego Helloworlda i rozbudowywać to. Jakoś trzeba zacząć naukę.

1

Osobiście używam takiej konfiguracji:

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>

	<name>...</name>

	<groupId>...</groupId>
	<artifactId>...</artifactId>
	<version>1.0</version>

	<packaging>war</packaging>
	
	<build>
		<finalName>...</finalName>
		<plugins>
			<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>
		</plugins>
	</build>

	<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-servlet-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.media</groupId>
			<artifactId>jersey-media-moxy</artifactId>
		</dependency>
	</dependencies>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<jersey.version>2.22.1</jersey.version>
	</properties>
</project>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
    <servlet>
        <servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>...</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>Jersey Web Application</servlet-name>
        <url-pattern>/webapi/*</url-pattern>
    </servlet-mapping>
</web-app>

w miejsce ... wstaw własne nazwy projektowe/paczek.

1

Konfiguracja w web.xml jest niepotrzebna, można dodać endpointy adnotacjami np.

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("/jersey")
public class JerseyApp extends Application {
  @Override
  public Set<Class<?>> getClasses() {
    Set set = new HashSet();
    set.add(RestResource.class);
    return set;
  }
}

RestResource to oczywiście endpoint REST (dowolny stateless session bean lub singleton).

Co do pom.xml to w dependencies na full profile:

<dependency>
  <groupId>javax</groupId>
  <artifactId>javaee-api</artifactId>
  <version>7.0</version>
  <scope>provided</scope>
</dependency>

Na web profile być może trzeba dopisać jersey-container-servlet-core.

Ja wole adnotacjami konfigurować. Jak ktoś preferuje XML to ok.

1

@margor90 masz rację - sprawdziłem i potwierdzam, że w wersji (WP) nie ma konieczności dodawania/konfiguracji web.xml. Również dobrze dodać wspomnianą przez Ciebie zależność i wszystko działa, jak należy. Konfiguracja przez adnotację jest jednak wygodniejsza i przy niej zostanę.

Po prostu wcześniej projekt tworzyłem z następującego repozytorium: http://mvnrepository.com/artifact/org.glassfish.jersey.archetypes/jersey-quickstart-webapp/2.22.1 i nie zmieniałem zbytnio konfiguracji.

0

Zmieniłem mój pom.xml. Usunąłem w IntelliJ folder z server-owymi zależnościami (z indexera IJ). Zrobiłem cele mvn clean i install. W folderze target mam paczkę blog-0.1.war. Dodałem w IntelliJ serwer Glassfish i artefakt który ma deployować, czyli mój .war. Mój nowy pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>pl.bajos</groupId>
    <artifactId>blog</artifactId>
    <version>0.1</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4-1204-jdbc41</version>
        </dependency>
        <dependency>
            <groupId>org.mindrot</groupId>
            <artifactId>jbcrypt</artifactId>
            <version>0.3m</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.persistence</groupId>
            <artifactId>persistence-api</artifactId>
            <version>1.0.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.0.5.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.0.5.Final</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.core</groupId>
            <artifactId>jersey-server</artifactId>
            <version>2.22.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jersey.containers</groupId>
            <artifactId>jersey-container-servlet</artifactId>
            <version>2.22.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

Deskryptor wdrożenia pozostał jak wcześniej. Przy deployu dostaję taki skrócony log: http://4programmers.net/Pastebin/4625 .
Server.log jest dużo dłuższy: http://4programmers.net/Pastebin/4624 . Z tego co rozumiem to wyjątek pochodzi od Hibernate, ponieważ on z tego co wiem używa JBossa do logów, czyli jest jego zależnością, ale już jeden jest na Glassfishu to chyba z tąd błędy.

1

Niestety Twojego IDE nie znam, ale widzę, że serwer używamy taki sam. Osobiście używam środowisko NetBeans 8.1 i GlassFish 4.0 (build 89). Czemu wróciłem do wcześniejszej wersji 4.0 z 4.1.1? Wczoraj natknąłem się na kolejne poważne błędy podczas niektórych operacji i podziękowałem. Więc jeśli chcesz sobie zaoszczędzić nerwów to wróć do tej wcześniejszej.

Wkleję Ci aktualną konfigurację mojego pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>
	
	<groupId>_paczka_</groupId>
	<artifactId>_nazwa_artefaktu_</artifactId>
	<version>1.0</version>
	<packaging>war</packaging>

	<name>_nazwa_projektu_</name>

	<properties>
		<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<jersey.version>2.22.1</jersey.version>
	</properties>

	<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>javax</groupId>
			<artifactId>javaee-web-api</artifactId>
			<version>7.0</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.containers</groupId>
			<artifactId>jersey-container-servlet</artifactId>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.core</groupId>
			<artifactId>jersey-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.media</groupId>
			<artifactId>jersey-media-moxy</artifactId>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.1</version>
				<configuration>
					<source>1.7</source>
					<target>1.7</target>
					<compilerArguments>
						<endorseddirs>${endorsed.dir}</endorseddirs>
					</compilerArguments>
				</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-dependency-plugin</artifactId>
				<version>2.6</version>
				<executions>
					<execution>
						<phase>validate</phase>
						<goals>
							<goal>copy</goal>
						</goals>
						<configuration>
							<outputDirectory>${endorsed.dir}</outputDirectory>
							<silent>true</silent>
							<artifactItems>
								<artifactItem>
									<groupId>javax</groupId>
									<artifactId>javaee-endorsed-api</artifactId>
									<version>7.0</version>
									<type>jar</type>
								</artifactItem>
							</artifactItems>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

jeszcze niech @margor90 rzuci na niego okiem, ale u mnie prawidłowo wdraża aplikację na serwer.

1

Web Profile to wykastrowany Full Profile, więc jak nie macie powodu to używajcie drugiego. Poza tym w JEE7 JAX-RS jest w Web Profile, więc nie potrzeba dodatkowych zależności

0

Pany, pobrałem najnowszego Tomcata, skonfigurowałem IntelliJ do współpracy z kotkiem i deploy się udał. Nie wiem co będzie dalej, jak zajdzie potrzeba DżejBossa albo Glassfisha itp., ale to wtedy się pomyśli.

PS. Co lepsze działa testowy serwis RESTfulowy wyświetlający legendarne "Hello world" od zapytania GET :D
PS2. Nie działa tylko welcome-file którego ścieżka welcome-file jest podana jako index.jsp i znajduje się w {root}/src/main/resources/index.jsp, a w archiwum war w głównym katalogu po otwarciu archiwum?

1

jak deploy się udał to dobrze. Jeśli już chodzi o samą naukę tworzenia RESTfulowego API z JAX-RS to na początek bardzo polecam Ci ten kurs: https://javabrains.io/courses/javaee_jaxrs

1 użytkowników online, w tym zalogowanych: 0, gości: 1