JavaEE технологии. JSON XML

Мало создать удобный интерфейс(REST API) доступа к нашему сервису необходимо так – же обеспечить передачу необходимых данных в структурированном виде. Более того, очень часто одним из условий является человеко-понятный формат. Возможно на первый взгляд это требование кажется нелепым, однако человеко-понятный формат данных может сэкономить вам множество времени в дебаге, а так-же позволит проверить правильность работы сервиса без наличия клиентских приложений. Сейчас существует 2 самых распространенных формата, в которых представляют данные: XML и JSON.

Как это работает?
Для начала нам необходимо создать модуль, который будет являться полной копией нашего модуля Day4_JAX_RS_Example, кроме 2х строк в файле pom.xml.

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">; 
    <parent> 
        <artifactId>JavaEE5Days</artifactId> 
        <groupId>JavaEE5Days</groupId> 
        <version>1.0-SNAPSHOT</version> 
    </parent> 
    <modelVersion>4.0.0</modelVersion> 
    <packaging>war</packaging> 
 
<artifactId>Day5_JAX_RS_JSON_XML_Example</artifactId> 
 
<properties> 
        <jersey.version>2.5.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>org.glassfish.jersey.containers</groupId> 
            <artifactId>jersey-container-servlet-core</artifactId> 
        </dependency> 
        <dependency> 
            <groupId>com.sun.jersey</groupId> 
            <artifactId>jersey-json</artifactId> 
            <version>1.18</version> 
        </dependency> 
    </dependencies> 
 
<build> 
        <finalName>JAX-RS-JSON-XML</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> 
 
</project>

Обратите внимание на изменившиеся имена и 1 дополнительную зависимость:

<artifactId>Day5_JAX_RS_JSON_XML_Example</artifactId> 
 
<finalName>JAX-RS-JSON-XML</finalName> 
 
<dependency> 
   <groupId>com.sun.jersey</groupId> 
   <artifactId>jersey-json</artifactId> 
   <version>1.18</version> 
</dependency>

Теперь нам необходимо добавить класс модели, который мы и будем сериализовать в JSON и XML. Поместите класс Book.java в пакет com.andrewkravets.model.
Book.java

package com.andrewkravets.model; 
 
import javax.xml.bind.annotation.XmlRootElement; 
import java.util.Date; 
 
/** 
 
Created by Andrew Kravets.
* Date: 1/ 5 /14. 
 
Url: andrewkravets.com
*/ 
@XmlRootElement(name = "book") 
public class Book { 
    Date publishDate; 
    String author; 
    String title; 
    String ISBN; 
 
public Date getPublishDate() { 
        return publishDate; 
    } 
 
public void setPublishDate(Date publishDate) { 
        this.publishDate = publishDate; 
    } 
 
public String getAuthor() { 
        return author; 
    } 
 
public void setAuthor(String author) { 
        this.author = author; 
    } 
 
public String getTitle() { 
        return title; 
    } 
 
public void setTitle(String title) { 
        this.title = title; 
    } 
 
public String getISBN() { 
        return ISBN; 
    } 
 
public void setISBN(String ISBN) { 
        this.ISBN = ISBN; 
    } 
}

Аннотация @XmlRootElement(name = «book») указывает на то, как необходимо назвать корневой элемент XML дерева во время сериализации.

Для того, чтобы наш REST сервис понимал, ка ему следует десериализовать JSON, в файл web.xml необходимо добавить следующий текст.

<init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
</init-param> 
<p>
Таким образом мы закончили подготовку и можем написать методы, которые будут отвечать за формирование ответа пользователю. Нам необходимо добавить несколько методов в наш файл IndexResource.java. 
</p>
<pre lang="xml">
IndexResource.java 
package com.andrewkravets; 
 
import com.andrewkravets.model.Book; 
 
import javax.ws.rs.GET; 
import javax.ws.rs.Path; 
import javax.ws.rs.PathParam; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
 
/** 
 
Created by Andrew Kravets.
* Date: 1/3/14. 
 
Url: andrewkravets.com
*/ 
@Path("/") 
public class IndexResource{ 
 
@GET 
    @Produces("text/plain") 
    public String getHelloWorld(){ 
        return "Hello World"; 
    } 
 
@GET 
    @Path("/{name}") 
    @Produces("text/plain") 
    public String sayHelloTo(@PathParam("name") String msg) { 
       return "Hello " + msg +"!"; 
    } 
 
@GET 
    @Path("/json") 
    @Produces(MediaType.APPLICATION_JSON) 
    public Book getPatientAsJSON(){ 
        return getBook(); 
    } 
 
@GET 
    @Path("/xml") 
    @Produces(MediaType.APPLICATION_XML) 
    public Book getPatientAsXML(){ 
       return getBook(); 
    } 
 
private Book getBook(){ 
        Book book = new Book(); 
        book.setAuthor("Jack London"); 
        book.setTitle("Martin Eden"); 
        book.setISBN("978-1594562600"); 
        return book; 
    } 
 
}

В нашем случае аннотации @Produces(MediaType.APPLICATION_XML) и @Produces(MediaType.APPLICATION_JSON) показывают формат, в котором будут получены сообщения.

Таким образом мы рассмотрели простой пример сериализации данных для веб-сервиса.

Спасибо Андрею Кравец за статью

Добавить комментарий