2013-07-10 12 views
29

Mam pewne doświadczenie w korzystaniu z Jersey < 2.0. Teraz próbuję zbudować aplikację wojenną, aby zapewnić interfejs API usługi JSON Webservice.Jersey 2.0 odpowiednik POJOMappingFeature

Jestem teraz walczą o znacznej ilości czasu próbuje skonfigurować Moxy i szwy się być o wiele bardziej skomplikowany niż to, co było dodanie

<init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 

do web.xml powrotem w Jersey < 2.0.

Czy jest jakaś możliwość powiedzenia "proszę dodać obsługę json"?

Obecnie mam po prostu dużo błędów Wewnętrzny błąd serwera bez żadnych wpisów dziennika na serwerze i tylko myśleć „muszę zrobić coś zupełnie złego, to nie może być takie trudne”

Może ktoś mi dać Wskazówka?

Odpowiedz

7

Można skonfigurować EclipseLink MOXy jako dostawcę powiązania JSON, konfigurując klasę MOXyJsonProvider za pośrednictwem klasy JAX-RS Application.

Przykład # 1

package org.example; 

import java.util.*; 
import javax.ws.rs.core.Application; 
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider; 

public class CustomerApplication extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     HashSet<Class<?>> set = new HashSet<Class<?>>(2); 
     set.add(MOXyJsonProvider.class); 
     set.add(CustomerService.class); 
     return set; 
    } 

} 

Przykład # 2

package org.example; 

import java.util.*; 
import javax.ws.rs.core.Application; 
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider; 

public class CustomerApplication extends Application { 

    @Override 
    public Set<Class<?>> getClasses() { 
     HashSet<Class<?>> set = new HashSet<Class<?>>(1); 
     set.add(ExampleService.class); 
     return set; 
    } 

    @Override 
    public Set<Object> getSingletons() { 
     MOXyJsonProvider moxyJsonProvider = new MOXyJsonProvider(); 

     moxyJsonProvider.setAttributePrefix("@"); 
     moxyJsonProvider.setFormattedOutput(true); 
     moxyJsonProvider.setIncludeRoot(true); 
     moxyJsonProvider.setMarshalEmptyCollections(false); 
     moxyJsonProvider.setValueWrapper("$"); 

     Map<String, String> namespacePrefixMapper = new HashMap<String, String>(1); 
     namespacePrefixMapper.put("http://www.example.org/customer", "cust"); 
     moxyJsonProvider.setNamespacePrefixMapper(namespacePrefixMapper); 
     moxyJsonProvider.setNamespaceSeparator(':'); 

     HashSet<Object> set = new HashSet<Object>(1); 
     set.add(moxyJsonProvider); 
     return set; 
    } 

} 

Aby uzyskać więcej informacji

+8

Nie można włączyć obsługi json w wersji 2.0 bez konieczności pisania kodu? –

3

faktycznie , dla mnie to zadziałało, z pominięciem parametru PojoMappingFeature.

Idąc do:

http://localhost:8080/webapi/myresource/complexObject/foo 

daje to JSON:

{"name":"foo","value1":1374185178829,"value2":42} 

internecie.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<!-- This web.xml file is not required when using Servlet 3.0 container, 
    see implementation details http://jersey.java.net/nonav/documentation/latest/jax-rs.html --> 
<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>com.example</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> 

punkt wejścia:

package com.example; 

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; 

/** 
* Root resource (exposed at "myresource" path) 
*/ 
@Path("myresource") 
public class MyResource { 

    /** 
    * Method handling HTTP GET requests. The returned object will be sent 
    * to the client as "text/plain" media type. 
    * 
    * @return String that will be returned as a text/plain response. 
    */ 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getIt() { 
     return "Got it!"; 
    } 

    @Path("complexObject/{name}") 
    @GET 
    @Produces({ MediaType.APPLICATION_JSON }) 
    public ComplexObject complexObject(@PathParam("name") String name) { 
     return new ComplexObject(name, System.currentTimeMillis(), 42L); 
    } 
} 

fasola do jsonize:

package com.example; 

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; 

/** 
* Root resource (exposed at "myresource" path) 
*/ 
@Path("myresource") 
public class MyResource { 

    /** 
    * Method handling HTTP GET requests. The returned object will be sent 
    * to the client as "text/plain" media type. 
    * 
    * @return String that will be returned as a text/plain response. 
    */ 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String getIt() { 
     return "Got it!"; 
    } 

    @Path("complexObject/{name}") 
    @GET 
    @Produces({ MediaType.APPLICATION_JSON }) 
    public ComplexObject complexObject(@PathParam("name") String name) { 
     return new ComplexObject(name, System.currentTimeMillis(), 42L); 
    } 
} 
+11

Wygląda na to, że skopiowałeś kod źródłowy MyResource zamiast kodu źródłowego Bean. – saltmotor

0

Wystarczy użyć @XmlElement zamiast @XmlAttribute (atrybut tylko odbiera @ prefiksu, ewentualnie zrestartować appserver dla zmienionego efektu!)

40

Proszę użyć poniższej zależności, która zrobi to automatycznie r ty.

<dependency> 
     <groupId>com.fasterxml.jackson.jaxrs</groupId> 
     <artifactId>jackson-jaxrs-json-provider</artifactId> 
     <version>2.2.3</version> 
    </dependency> 
+0

Dziękuję, to zadziałało! – NdrU

+0

To jest najprostszy sposób to zrobić. AFAIK, Jackson jest standardem przemysłowym defacto w zakresie usług internetowych JSON. – devdanke

+0

Googling tej zależności prowadzi do wycofania repozytorium github, które samo prowadzi do zaktualizowanego repozytorium github z inną nazwą zależności: https://github.com/FasterXML/jackson-jaxrs-providers –

2

Znaleziony to jak dobrze działa, i był najłatwiejszy w rozwiązaniu problemu (AFAIT)

zawierać poniższą zależność w swoim pom.xml/include odpowiedniego pliku JAR w lib ścieżkę

<dependency> 
    <groupId>com.owlike</groupId> 
    <artifactId>genson</artifactId> 
    <version>0.99</version> 
</dependency 

Link here

9

Jeśli chcesz go zdefiniować w pliku web.xml następnie:

Jackson:

<init-param> 
    <param-name>jersey.config.server.provider.classnames</param-name> 
    <param-value>org.glassfish.jersey.jackson.JacksonFeature</param-value> 
</init-param> 

Moxy

<init-param> 
    <param-name>jersey.config.server.provider.classnames</param-name> 
    <param-value>org.glassfish.jersey.moxy.json.MoxyFeature</param-value> 
</init-param> 

A jeśli przy użyciu Maven dodaj następującą zależność do pliku pom

JACKSON

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>your jersey version</version> 
</dependency> 

MOXY

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-moxy</artifactId> 
    <version>your jersey version</version> 
</dependency> 
+0

Dziękujemy! Nie mogę zrozumieć, dlaczego nie było tego w sekcji migracji JSON ich dokumentacji: https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json –

+0

Jak dodać tylko JSONFeature Praca klasowa? Jak wygląda jersey, jeśli adnotacje xml w klasie pojo powinny być odczytywane, czy nie bez określenia JaxbAnnotationInterpreter? –

Powiązane problemy