Podłączenie Jersey do projektu Java EE.

Podłączenie Jersey do projektu Java EE.
bajos
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:UwUdź
  • Postów:267
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:

Kopiuj
<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:

Kopiuj
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.22.1</version>
</dependency>

128 postów [25.06.2015r. 21:03]
edytowany 2x, ostatnio: bajos
M9
  • Rejestracja:około 10 lat
  • Ostatnio:około 6 lat
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.
bajos
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:UwUdź
  • Postów:267
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?


128 postów [25.06.2015r. 21:03]
edytowany 1x, ostatnio: bajos
bajos
@margor90, po edycji i dodaniu adnotacji usera nie wyswietli powiadomienia, więc wołam tutaj.
M9
  • Rejestracja:około 10 lat
  • Ostatnio:około 6 lat
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.

bajos
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:UwUdź
  • Postów:267
0

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

Kopiuj
<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ę.


128 postów [25.06.2015r. 21:03]
EvilOne
  • Rejestracja:około 14 lat
  • Ostatnio:5 dni
  • Postów:78
1

Osobiście używam takiej konfiguracji:

pom.xml

Kopiuj
<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

Kopiuj
<?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.

bajos
@EvilOne, ale też na tym Glassfishu i SDK?
EvilOne
tak - używam Glassfish 4.1.1 (WebProfile).
M9
na WebProfile miałem kiedyś sytuację, że chyba rzeczywiście trzeba podać jersey-container-servlet-core, a zdaje się że niby JAX-RS jest oficjalnie w WebProfile (bez tego nie było jakby sewera na GlassFish 4.0 WebProfile)
M9
  • Rejestracja:około 10 lat
  • Ostatnio:około 6 lat
1

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

Kopiuj
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:

Kopiuj
<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.

edytowany 1x, ostatnio: margor90
bajos
@margor90, to scope: provided to oznacza, że jest to zależność, ale z zew źródła jest zapewniona?
M9
provided oznacza, że zależność jest już na serwerze aplikacyjnym, jest pobierana na potrzeby IDE i kompilacji. http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Scope
EvilOne
  • Rejestracja:około 14 lat
  • Ostatnio:5 dni
  • Postów:78
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.

bajos
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:UwUdź
  • Postów:267
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:

Kopiuj
<?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.


128 postów [25.06.2015r. 21:03]
edytowany 1x, ostatnio: bajos
bajos
Może zamiast GF będzie lepiej użyć Tomcata?
M9
Na początek daj spokój z Hibernate, bo masz EclipseLink na GlassFishu. Zbuduj jakiś Hello World zwracający JSON bez bazy. Można użyć Tomcata, ale na GlassFishu jest prościej, bo Jersey jest jego częścią. I masz integracje z EJB i CDI out-of-box.
EvilOne
  • Rejestracja:około 14 lat
  • Ostatnio:5 dni
  • Postów:78
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:

Kopiuj
<?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.

edytowany 1x, ostatnio: EvilOne
Zobacz pozostały 1 komentarz
M9
Z ciekawości, na jakie błędy w 4.1.1 się natknąłeś? Pytam, bo mam produkcję na 4.0 na jednym z serwerów i chciałbym stopniowo podnieść: dużo poprawek znanych błędów. Słyszałeś o Payara? To częściej łatany i wspierany komercyjnie wariant GlassFisha, do tego chcę migrować. W configu nie podoba mi się nie podawanie wersji redundantnych pakietów. Poza tym wydaje mi się, że javaee-api powinno spokojnie wystarczyć dla REST w full profile. Dzięki Payara rozwój GlassFisha mocno przyspieszył. Czy te błędy są śledzone w Payara?
M9
Kiedyś mocno irytował mnie zepsuty zdalny deploy w GlassFish 4.1, ale był na to patch.
M9
Chyba wiem po co to zależność: jersey-media-moxy. W standardzie jest JAXB. Z ciekawości, dlaczego Moxy? Klient to jasna sprawa.
EvilOne
irytujące, że nawet najprostsza funkcjonalność, przy tworzeniu Connection pool nie działa: http://stackoverflow.com/a/33066856. Tutaj nawet w odpowiedzi radzą zastanowić się nad wspomnianą przez Ciebie alternatywą (i sam się teraz zaczynam zastanawiać).
EvilOne
druga sprawa to właśnie jersey-media-moxy. Dodałem ją dla obsługi formatu Json. Oczywiście w wersji 4.1.1 nie działa.
SP
  • Rejestracja:ponad 9 lat
  • Ostatnio:ponad 2 lata
  • Postów:127
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

bajos
@student pro, myślałem, że jest odwrotnie. Na stronie Oracle w pobieraniu z opisu Web Profile miało coś więcej. Co? Nie pisało, oprócz tego "Web Profile", więc w ciemno to wybrałem. Teraz sobie wpisałem coś w stylu "glassfish web profile" w G i zobaczyłem Full Profile vs. Web Profile, ale trochę za późno :D. Pobiorę wersję Full Profile.
bajos
  • Rejestracja:prawie 12 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:UwUdź
  • Postów:267
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?


128 postów [25.06.2015r. 21:03]
edytowany 3x, ostatnio: bajos
bajos
PS. Ogólnie to czytam kursy na www.kobietydokodu.pl (troche xD), a tam jadą na Tomcat'cie.
EvilOne
  • Rejestracja:około 14 lat
  • Ostatnio:5 dni
  • Postów:78
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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.