Скажите Джерси генерировать правильные документы JSON (натуральный json). Я использую один и тот же класс для приложения отдыха и JAXBContext resolver, нашел его наиболее чистой инкапсуляцией.
Лучший программист может реализовать помощник для итерации файлов .class и автоматического перечисления соответствующих классов, идентифицируя теги @Annotation. Я не знаю, как это сделать во время выполнения в собственном исходном коде.
Эти две ссылки были полезны при изучении этого дополнительного java жаргона. Я не знаю, почему нет параметра Джерси, чтобы все работало из коробки.
WEB-INF / web.xml (фрагмент):
<servlet>
<servlet-name>RESTServlet</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.myapp.rest.RESTApplication</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>RESTServlet</servlet-name>
<url-pattern>/servlet/rest/*</url-pattern>
</servlet-mapping>
com.myapp.rest.RESTApplication.java
package com.myapp.rest;
import java.util.*;
import javax.ws.rs.core.Application;
import javax.ws.rs.ext.ContextResolver;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import com.sun.jersey.api.json.JSONConfiguration;
import com.sun.jersey.api.json.JSONJAXBContext;
public class RESTApplication extends Application implements ContextResolver<JAXBContext> {
private JAXBContext context;
private Class<?>[] types;
public RESTApplication() throws JAXBException {
// list JAXB bean types to be used for REST serialization
types = new Class[] {
com.myapp.rest.MyBean1.class,
com.myapp.rest.MyBean2.class,
};
context = new JSONJAXBContext(JSONConfiguration.natural().build(), types);
}
@Override
public Set<Class<?>> getClasses() {
// list JAXB resource/provider/resolver classes
Set<Class<?>> classes = new HashSet<Class<?>>();
//for(Class<?> type : types)
// classes.add(type);
classes.add(MyBeansResource.class);
classes.add(this.getClass()); // used as a ContextResolver class
return classes;
}
@Override
public JAXBContext getContext(Class<?> objectType) {
// this is called each time when rest path was called by remote client
for (Class<?> type : types) {
if (type==objectType)
return context;
}
return null;
}
}
Классы MyBean1, MyBean2 являются простыми объектами java, а класс MyBeansResource - класс с функциями отдыха @Path. В них нет ничего особенного, ожидайте стандартного jaxp @ Annotations здесь и там. После этого JSON-документы java jargon имеют
- ноль или одноэлементные списочные массивы всегда записываются в виде массива json (поле [])
- примитивные целые числа и логические поля записываются как примитивы json (без кавычек)
Я использую следующую среду
- Sun Java JDK1.6.x
- Apache Tomcat 6.x
- библиотеки Jersey v1.14 (jersey-archive-1.14.zip)
- В папке webapps / myapp / WEB-INF / lib есть asm-3.3.1.jar, jackson-core-asl.jar, jersey-client.jar, jersey-core.jar, jersey-json.jar, jersey- библиотеки server.jar, jersey-servlet.jar
- добавьте необязательный annotation-detector.jar, если вы используете инструмент обнаружения infomas-asl
jersey-archive.zip имел более старый файл asm-3.1.jar, вероятно, работает нормально, но chapter_deps.html ссылается на более новый файл. См. Список ссылок вверху.
Редактировать
Я нашел отличный (быстрый, легкий, всего 15 КБ) инструмент для поиска аннотаций. См. Этот пост о том, как я автоматически обнаруживаю типы во время выполнения, и больше не нужно редактировать RESTApplication каждый раз, когда добавляется новый бин java (jaxb).
https://github.com/rmuller/infomas-asl/issues/7