Jax-rs 2.0

Revision as of 12:13, 16 February 2019 by Adam (talk | contribs) (web.xml)

Revision as of 12:13, 16 February 2019 by Adam (talk | contribs) (web.xml)

JAX-RS szerver

Inicializálás

A JAX-RS szerver futtatásához el kell indítsuk a Jersy servlet-et a WEB alkalmazásunkban, ami kiválóan megfér más servlet-ek mellett, pl JSF. A Jersey servletnek meg fogjuk mondani, hogy milyen PATH tartozik hozzá, így minden más erőforrás kérés továbbra is a JSF servlet-hez fog beesni.

Maven dependenciák

		<dependency>
			<groupId>org.glassfish.jersey.containers</groupId>
			<artifactId>jersey-container-servlet</artifactId>
			<version>2.28</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.inject</groupId>
			<artifactId>jersey-hk2</artifactId>
			<version>2.28</version>
		</dependency>
		<dependency>
			<groupId>org.glassfish.jersey.core</groupId>
			<artifactId>jersey-common</artifactId>
			<version>2.28</version>
		</dependency>


web.xml

Ha JSF-et akarunk párhuzamosan JAX-RS-el használni, akkor nincs más dolgunk, mint hogy mint két serlvet implementációt felvegyünk a web.xml-be. Elsőként a JSF implementációt, ami az esetünkben PrimeFaces lesz, aztán meg felvesszük a JAX-RS serlvetet, ami az esetünkben Glassfish-Jeresy lesz.

A Glassfish-Jeresy-t többféle képen lehet paraméterezni. Vagy itt, a web.xml-ben adjuk meg a szükséges paramétereket (provide-erek, mapperek, stb..) vagy implementáljuk a javax.ws.rs.core.Application osztályt, megadjuk a helyét a javax.ws.rs.Application paraméterrel, majd a konfigurációt többi részét az osztályon belül definiáljuk.

Elsőre nézzük az a web.xml-es konfigurációt. <init-param> szekciókkal kell megadni a Jersey paramétereit:

  • jersey.config.server.provider.packages: meg kell adni azt a java csomagot, ahol a webservice implementációk és az exception mapper-ek vannak. Mi itt azt a csomagot adjuk meg, ahol a service implementációk vannak.
  • jersey.config.server.provider.classnames: fel lehet sorolni konkrét class megadásokkal további implementációkat. Mi itt az Exception mapper-eket adjuk meg.


A servlet-mapping szekcióban elsőre megadjuk hogy a Jeresey servlet a /rest/ útvonalon fog hallgatózni. Aztán adjuk meg a JSF servletet, ami minden másra illeszkedni fog.

...
	<!-- JSF servlet -->
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

        <!-- Jersey servlet -->
	<servlet>
		<servlet-name>Jersey Service</servlet-name>

		<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
		<init-param>
			<param-name>jersey.config.server.provider.packages</param-name>
			<param-value>hu.adam.loginHelper.jaxrs.service</param-value>
		</init-param>

		<init-param>
			<param-name>jersey.config.server.provider.classnames</param-name>
			<param-value>
                           hu.adam.loginHelper.jaxrs.mapper.AppExceptionMapper;
                           hu.adam.loginHelper.jaxrs.mapper.ErrorMessage;
                           hu.adam.loginHelper.jaxrs.mapper.WebServiceExceptionMapper
                         </param-value>
		</init-param>

		<load-on-startup>1</load-on-startup>
	</servlet>

        <!-- Jersey mapping -->
	<servlet-mapping>
		<servlet-name>Jersey Service</servlet-name>
		<url-pattern>/rest/*</url-pattern>
	</servlet-mapping>

        <!-- JSF servlet -->
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>/faces/*</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.jsf</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.faces</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>


Másik alternatíva lenne ha JAX-RS konfigurációt a javax.ws.rs.core.Application osztály implementációjában definiálnánk. Ekkor a web.xml-ben csak az implementációs osztályt kell megadni: ha a web.xml-ben az

	<!-- Jersey servlet -->
	<servlet>
		<servlet-name>Jersey Service</servlet-name>
		<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
		<init-param>
			<param-name>javax.ws.rs.Application</param-name>
			<param-value>hu.adam.MyApplication</param-value>
		</init-param>


Majd a tovább konfigurációkat az implementációs osztályban definiáljuk:

import java.util.HashSet;
import java.util.Set;

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

@ApplicationPath("/rest/")
public class MyApplication extends Application {
	
	 public Set<Class<?>> getClasses() {
	        Set<Class<?>> s = new HashSet<Class<?>>();
                //Webservices
	        s.add(LoginService.class);
	        
                //Mappers
	        s.add(AppExceptionMapper.class);	        
	        s.add(GenericExceptionMapper.class);	        
	        return s;
	    }	
}

Service osztály definiálása

Jax-rs kliens:

InitializeLoginResponse initializeLoginResponse = client.target(baseUrl).path("login").request(MediaType.APPLICATION_JSON)
					.post(Entity.json(initializeLoginRequest), InitializeLoginResponse.class);

JAX-RS kliens