2016-02-22 8 views
1

Я использую Джерси GlassFish реализации 2.0 для restfull веб-службы с котом 8.REST API Джерси Glassfish не сериализации JSON

Мои веб serives работают нормально, но сериализации моего Java Bean не является правильным. Например мой веб-сервиса возврат последующей JSon

{ 
    "errorCode": 200, 
    "obj": "DestinationCountry [img=[], code=3, video=AbstractMultiMediaContent [id=0, name=null, url=null, file=null, contentType=null, comments=null, owner=null, likes=null, tags=null, is=null], guide=Guide [guideTraslation=null, getPoi()=null, ...... 
} 

Право должно быть в формате JSON

{ 
    "errorCode": 200, 
    "errorMsg": null, 
    "obj": [ 
     { 
      "comparableInfo": null, 
      "id": 2195, 
      "code": "3", 
      "name": "Sudafrica", 
      "continent": null, 
      "idDestinationCountry": 690, 
      "previewImage": { 
       "comparableInfo": null, 
       "id": 0, 
       "name": null, 
       "url": "sud_africa_viaggi_diving_2", 
       "file": null, 
       "contentType": null, 
       "comments": null, 
       "owner": null, 
       "likes": null, 
       "tags": null, 
       "is": null, 
       "numberOfLike": 0 
      } 

, ..... .....

Это мой код Java

@GET 
@Path("/guide/id/{idguide}") 
@Produces(MediaType.APPLICATION_JSON) 
public Response getGuideById(@PathParam("idguide") int idguide, @QueryParam("uuid") String uuid) 
{ 

    Response response = null ; 
    DCResponse<Guide> dcResp = null ; 
    Configuration conf = ConfigurationFactory.getInstance() ; 
    try 
    { 
     conf.configurationLoader(UtilsConstants.SYS_CONF_FILE); 
     DiveCircleManagerIV2 pm = (DiveCircleManagerIV2) CoreFactory.getInstance(conf.getProperty(DiveCircleConstants.DIVECIRCLE_MANAGER)) ; 
     dcResp = pm.findGuideById(idguide) ; 
     response = Response.status(dcResp.getErrorCode()).entity(dcResp).build() ; 
    } 
    catch (ConfigurationException | IOException | FactoryException | ManagerException e) { 
     log.error(e); 
     e.printStackTrace(); 
     response = Response.status(DiveCircleConstants.INTERNAL_ERROR_CODE).build() ; 
    } 

    return response ; 

} 

Вот мои POM зависимости

<dependencies> 
    <dependency> 
     <groupId>com.sun.xml.ws</groupId> 
     <artifactId>jaxws-tools</artifactId> 
     <version>2.2.8</version> 
    </dependency> 

    <dependency> 
     <groupId>com.divecircle.booking.api</groupId> 
     <artifactId>BookingAPI</artifactId> 
     <version>0.1</version> 
    </dependency> 

    <dependency> 
     <groupId>com.geeoz.ean</groupId> 
     <artifactId>ean-api</artifactId> 
     <version>3.25.0d1</version> 
    </dependency> 


    <dependency> 
     <groupId>javax.transaction</groupId> 
     <artifactId>jta</artifactId> 
     <version>1.1</version> 
    </dependency> 


    <dependency> 
     <groupId>org.apache.httpcomponents</groupId> 
     <artifactId>httpclient</artifactId> 
     <version>4.3.4</version> 
    </dependency> 


    <dependency> 
     <groupId>org.jdom</groupId> 
     <artifactId>jdom2</artifactId> 
     <version>2.0.6</version> 
    </dependency> 

    <dependency> 
     <groupId>com.cloudinary</groupId> 
     <artifactId>cloudinary</artifactId> 
     <version>1.0.8</version> 
    </dependency> 
    <dependency> 
     <groupId>com.mandrillapp.wrapper.lutung</groupId> 
     <artifactId>lutung</artifactId> 
     <version>0.0.4</version> 
    </dependency> 

    <dependency> 
     <groupId>org.quartz-scheduler</groupId> 
     <artifactId>quartz</artifactId> 
     <version>2.1.5</version> 
    </dependency> 

    <dependency> 
     <groupId>net.sourceforge.jexcelapi</groupId> 
     <artifactId>jxl</artifactId> 
     <version>2.6.12</version> 
    </dependency> 


    <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.6</version>    
    </dependency> 

    <dependency> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-client</artifactId> 
     <version>1.18.3</version> 
     <scope>test</scope> 
    </dependency> 



    <dependency> 
     <groupId>org.glassfish.jersey.containers</groupId> 
     <artifactId>jersey-container-servlet-core</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-multipart</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.core</groupId> 
     <artifactId>jersey-client</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-moxy</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 


    <!-- ###############################################--> 
    <!-- <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-json-processing</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.glassfish.jersey.media</groupId> 
     <artifactId>jersey-media-sse</artifactId> 
     <version>${jersey.version}</version> 
    </dependency> 
    --> 

    <!-- ###############################################--> 



    <dependency> 
     <groupId>net.spy</groupId> 
     <artifactId>spymemcached</artifactId> 
     <version>2.12.0</version> 
    </dependency> 



    <dependency> 
     <groupId>com.cstadvising.utils</groupId> 
     <artifactId>Utils</artifactId> 
     <version>1.0</version> 
    </dependency> 


    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.17</version> 
    </dependency> 



    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.12</version> 
     <scope>test</scope>   
    </dependency> 


    <dependency> 
     <groupId>com.sun.xml.ws</groupId> 
     <artifactId>jaxws-tools</artifactId> 
     <version>2.2.8</version> 
    </dependency> 




    <dependency> 
     <groupId>javax.xml.ws</groupId> 
     <artifactId>jaxws-api</artifactId> 
     <version>2.2.11</version> 
    </dependency> 

    <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
    </dependency> 
</dependencies> 

это моя web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 

    <display-name>DiveCircle</display-name> 




    <listener> 
     <description>System Inizilizer</description> 
     <listener-class>com.cstadvising.utils.core.listener.SystemContextListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>jersey-serlvet</servlet-name> 
     <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>   
     <init-param> 
      <param-name>jersey.config.server.provider.classnames</param-name> 
      <param-value>org.glassfish.jersey.moxy.json.MoxyFeature;org.glassfish.jersey.media.multipart.MultiPartFeature</param-value> 
     </init-param> 
     <init-param> 
       <param-name>jersey.config.server.provider.packages</param-name> 
       <param-value>com.divecircle.restful</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

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



    <listener> 
     <listener-class>org.quartz.ee.servlet.QuartzInitializerListener</listener-class> 
    </listener> 

    <context-param> 
    <param-name>quartz:config-file</param-name> 
    <param-value>/quartz.properties</param-value> 
    </context-param> 
    <context-param> 
    <param-name>quartz:shutdown-on-unload</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <context-param> 
    <param-name>quartz:wait-on-shutdown</param-name> 
    <param-value>true</param-value> 
    </context-param> 
    <context-param> 
    <param-name>quartz:start-on-load</param-name> 
    <param-value>true</param-value> 
    </context-param> 
<!--  
    <servlet> 
     <servlet-name>QuartzInitializer</servlet-name> 
     <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet 
      </servlet-class> 
     <init-param> 
      <param-name>shutdown-on-unload</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <init-param> 
      <param-name>start-scheduler-on-load</param-name> 
      <param-value>true</param-value> 
     </init-param> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    --> 
</web-app> 

Любое предложение приемлемо или решение?

ответ

0

Проблема с MOXy (то есть jersey-media-moxy). При сериализации он должен знать всю информацию о типе. С DCResponse, у вас есть общий тип, который стирается во время компиляции

@XmlRootElement 
public class DCResponse<T> { 

    private int status; 
    private String errorMsg; 
    private List<T> obj; 

Когда DCResponse<Guide> dcResp компилируется, тип стирается, из-за type erasure. Чтобы обойти это, Джерси предлагает GenericEntity, который захватывает общий тип и передает его в сериализатор. Таким образом, вы сделаете это

DCResponse<Guide> dcResp = dcResp = pm.findGuideById(idguide); 
response = Response.status(dcResp.getErrorCode()) 
     .entity(new GenericEntity<DCResponse<Guide>>(dcResp) {}).build(); 

Это должно сработать.

Или если вы не хотите беспокоиться о таких вещах, подумайте об использовании Джексона вместо MOXy. Джексон, как правило, не сталкивается с такими проблемами, поскольку он просто изучает свойства. Для использования Джексона, вам нужно избавиться от Moxy (это важно), и добавьте следующий

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>${jersey.version}</version> 
</dependency> 

Тогда вместо MoxyJsonFeature, вам нужно зарегистрировать JacksonFeature

Смежные вопросы