Джерси 2.0 эквивалент POJOMappingFeature
У меня есть опыт использования Jersey < 2,0. Теперь я пытаюсь создать военное приложение для предоставления API-интерфейса JSON Webservice.
Сейчас я изо всех сил пытаюсь настроить 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"?
В настоящее время я просто получаю много ошибок внутреннего сервера без каких-либо записей журнала на сервере и просто думаю: "Я должен сделать что-то совершенно неправильное, это не может быть так сложно"
Может кто-нибудь подскажет мне?
Ответы
Ответ 1
Вы можете настроить 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;
}
}
Дополнительная информация
Ответ 2
Пожалуйста, используйте приведенную ниже зависимость, которая сделает это автоматически для вас.
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.2.3</version>
</dependency>
Ответ 3
Если вы хотите определить его в файле 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, добавьте следующую зависимость к вашему pom файлу
ДЖЕКСОН
<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>
Ответ 4
Здесь пример Джерси для работы с MOXy и JSON:
https://github.com/jersey/jersey/tree/master/examples/json-moxy
Вот руководство пользователя Jersey, в котором описывается, как настроить Jersey и MOXy для поддержки JSON:
https://jersey.java.net/documentation/latest/media.html#json.moxy
Ответ 5
В целом, это просто сработало для меня с параметром PojoMappingFeature.
Переход к:
http://localhost:8080/webapi/myresource/complexObject/foo
дает этот json:
{"name":"foo","value1":1374185178829,"value2":42}
web.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);
}
}
bean для 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);
}
}
Ответ 6
Обнаружено, что это хорошо работает и было самым простым в решении проблемы (AFAIT)
Включите приведенную ниже зависимость в свой pom.xml/включите соответствующий JAR файл в путь lib
<dependency>
<groupId>com.owlike</groupId>
<artifactId>genson</artifactId>
<version>0.99</version>
</dependency
Ссылка здесь
Ответ 7
Просто используйте @XmlElement вместо @XmlAttribute (только атрибут получает префикс @, возможно, перезагружает ваш сервер приложений для измененного эффекта!)