2013-07-10 5 views
29

У меня есть опыт использования Джерси < 2.0. Теперь я пытаюсь создать военное приложение для предоставления API-интерфейса JSON Webservice.Джерси 2.0 эквивалент POJOMappingFeature

Я сейчас борюсь за значительное количество времени, пытаясь настроить Moxy и швы, чтобы быть гораздо сложнее, чем то, что было добавления

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

вашего web.xml обратно в Джерси < 2.0.

Есть ли возможность просто сказать «пожалуйста, добавьте поддержку json»?

В настоящее время я просто получаю много ошибок Внутренняя ошибка сервера без каких-либо записей журнала на сервере и просто думаю, что «я должен сделать что-то совершенно неправильно, это не может быть так трудно»

Может кто-нибудь дать мне Намек?

ответ

7

Вы можете настроить EclipseLink MOXy как поставщика привязки JSON, сконфигурировав класс MOXyJsonProvider с помощью класса JAX-RS Application.

Пример # 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; 
    } 

} 

Пример # 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; 
    } 

} 

Для получения дополнительной информации

+8

Невозможно включить поддержку json в 2.0 без необходимости писать код? –

3

ФАКТИЧЕСКИ , это просто сработало для меня, когда параметр PojoMappingFeature пропущен.

Отправляясь:

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

дает этот JSON:

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

Интернет.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> 

точка входа:

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); 
    } 
} 

фасоль в 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

похоже, что вы скопировали исходный код MyResource вместо исходного кода Bean. – saltmotor

0

Просто используйте @XmlElement вместо @XmlAttribute (только атрибут принимает @ префикс, возможно, перезапустить сервер приложений для измененного эффекта!)

40

Пожалуйста, используйте приведенную ниже зависимость, которая будет делать это автоматически для ты.

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

Спасибо, это сработало! – NdrU

+0

Это самый простой способ сделать это. AFAIK, Jackson является отраслевым стандартом deacto для выпуска веб-сервисов JSON. – devdanke

+0

Включение этой зависимости приводит к устаревшему реестру github, который сам ведет к обновленному реестру github с другим именем зависимостей: https://github.com/FasterXML/jackson-jaxrs-providers –

2

Нашел, а также работает, и был самым простым в решении проблемы (AFAIT)

Включать ниже зависимость в вашем pom.xml/включить соответствующий файл JAR в Lib пути

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

Link here

9

Если вы хотите определить его в файле web.xml, то:

ДЖЕКСОН:

<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> 

А если использовать Maven добавить следующую зависимость в файл пом

ДЖЕКСОН

<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

Спасибо! Я не могу понять, почему это не было в разделе переноса jersey json из их документов: https://jersey.java.net/documentation/latest/migration.html#mig-1-x-json –

+0

Как добавить только JSONFeature классная работа? Как выглядит трикотажная фигура, следует ли читать xml-аннотации в классе pojo, не указывая JaxbAnnotationInterpreter? –