31 Mart 2017 Cuma

Jersey

Jersey Nedir?
Açıklaması şöyle. JAX-RS API'sini gerçekleştirmek ve GlassFish içinde kullanmak. Bizim açımızdan GlassFish önemli olmadığı için sadece JAX-RS API'sini gerçekleştirmesi yeterli :)
Goals of Jersey project can be summarized in the following points:
  • Track the JAX-RS API and provide regular releases of production quality Reference Implementations that ships with GlassFish;
Kurulum
Şöyle yaparız. Jersey + Jackson beraber indirilir.
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>2.25.1</version>
</dependency>
ServletContainer - XML
Örnek 1 - using servlet's init param
Şöyle yaparız. Burada resource'lar yani restful sınıflar com.example dizininde. Servlet'e parametreleri jersey.config.server.provider.packages olarak geçmek sadece Jersey tarafından destekleniyor, portable değil.
<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>com.example</param-value>
  </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
Şöyle yaparız.
<servlet>
  <servlet-name>Jersey RESTful 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>rest</param-value>
    </init-param>
    <init-param>
      <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
      <param-value>true</param-value>
    </init-param>
</servlet>
Şöyle yaparız. Burada jersey.config.server.provider.packages yanında jersey.config.server.provider.classnames değerleri de geçiliyor. Ne işe yarıyor bilmiyorum.
<servlet>
  <servlet-name>User 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>demo.web.ix.users</param-value>
    </init-param>
    <init-param>
      <param-name>jersey.config.server.provider.classnames</param-name>
      <param-value>org.glassfish.jersey.filter.LoggingFilter;
            org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
    </init-param>
    <init-param>
      <param-name>myCustomParam</param-name>
      <param-value>some_value</param-value>
    </init-param>
  <load-on-startup>1</load-on-startup>
</servlet>
Multipart veri almak için şöyle yaparız.
"jersey.config.server.provider.classnames",
"org.glassfish.jersey.media.multipart.MultiPartFeature"
Şöyle yaparız. com.sun.jersey.config.feature.Redirect ve diğer şeylerin ne olduğunu bilmiyorum.
<init-param>
  <param-name>com.sun.jersey.config.feature.Redirect</param-name>
  <param-value>true</param-value>
</init-param>
<init-param>
  <param-name>com.sun.jersey.config.property.JSPTemplatesBasePath</param-name>
  <param-value>/views/</param-value>
</init-param>
<init-param>
  <param-name>com.sun.jersey.config.property.WebPageContentRegex</param-name>
  <param-value>/(images|css|jsp)/.*</param-value>
</init-param>
Örnek 2 - using javax.ws.rs.Application as servlet's init param
Şöyle yaparız. Burada resource'lar MyApplication sınıfında
Servlet'e parametreleri javax.ws.rs.Application olarak geçmek tüm servlet'ler tarafından desteleniyor.
<servlet>
  <servlet-name>jersey-serlvet</servlet-name>
  <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
      <param-name>javax.ws.rs.Application</param-name>
      <param-value>full.qualified.name.to.MyApplication</param-value>
    </init-param>
  <load-on-startup>1</load-on-startup>
</servlet> 
Şöyle yaparız.
public class MyApplication extends javax.ws.rs.core.Application {
  public Set<Class<?>> getClasses() {
    Set<Class<?>> s = new HashSet<Class<?>>();
    s.add(ResourceA.class);
    return s;
}
Örnek 3 - defining only your JAX-RS applications without any servlets
Örnek ver

Örnek 4 - without an explicitly-defined JAX-RS application
Örnek ver

ServletContainer - Kod
ServletContainer hem HttpServlet hem de Filter sınıflarından kalıtır. Kod ile kullanmak istersek şöyle yaparız.
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.server.mvc.jsp.JspMvcFeature;
import org.glassfish.jersey.servlet.ServletContainer;
import org.glassfish.jersey.servlet.ServletProperties;


Filter getJerseyFilter() {
  final ResourceConfig config = new ResourceConfig()
    .register(new Foo())
    .register(JspMvcFeature.class)
    .property(ServletProperties.FILTER_FORWARD_ON_404, true);
  return new ServletContainer(config);
}
@Path
Path Anotasyonu yazısına taşıdım.

@Post
Post Anotasyonu yazısına taşıdım.

@Consumes
Post metodu ile veri alırken kullanılır. Şu satırları dahil ederiz.
import javax.ws.rs.Consumes;
import javax.ws.rs.core.MediaType;
Şöyle yaparız.
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String uploadFile(
  @FormDataParam("file") InputStream uploadedInputStream,
  @FormDataParam("file") FormDataContentDisposition fileDetail) {
    ...
}
Şöyle yaparız.
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces("text/html")
public Response uploadFile(
  @FormDataParam("username") String username,
  @FormDataParam("password") String password,
  @FormDataParam("title") String title,
  @FormDataParam("file") InputStream fileInputString,
  @FormDataParam("file") FormDataContentDisposition fileInputDetails) {
    String status = "File has been uploaded to ...";    ...
    return Response.status(200).entity(status).build();
}

@Produces
Get metodu ile sonuç dönerken kullanılır. Şu satırları dahil ederiz.
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
Metodun başına yazarız. Şöyle yaparız.
@GET
@Produces({MediaType.APPLICATION_JSON,MediaType.APPLICATION_XML})
public List<Party> getAllParties() throws Exception
{...}