Tell Jersey generuje odpowiednie dokumenty JSON (natural json). Używam tej samej klasy dla aplikacji odpoczynku i resolwera JAXBContext, uznałem ją za najbardziej czystą enkapsulację.
Lepszy programista może zaimplementować pomocnika do iterowania plików .class i automatycznie wymieniać odpowiednie klasy, identyfikując @ znaczniki adnotacji. Nie wiem jak to zrobić w czasie wykonywania we własnym kodzie źródłowym.
Te dwa linki pomogły w przestudiowaniu tego dodatkowego żargonu java. Nie wiem, dlaczego nie ma parametru Jersey, który sprawiłby, że wszystko po prostu wyszło z pudełka.
WEB INF/web.xml (fragment)
<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;
}
}
Klasy MyBean1, MyBean2 są obiektami Java ślizgowe i klasy MyBeansResource jedną z @Path funkcji odpoczynku. Nie ma w nich niczego wyjątkowego, oczekując standardowego jaxp @Annotations tu i tam.Po tym java żargonie dokumentów JSON mieć
- zero lub tablice Lista pojedynczych elementów są zawsze zapisywane jako json tablicy ([] polowym)
- prymitywne całkowitymi i pola boolowskie są zapisywane jako prymitywów json (bez cytatów)
używam Poniżej przedstawiono
- Sun Java JDK1.6.x
- Apache Tomcat 6.x
- biblioteki Jersey v1.14 (jersey-archive-1.14.zip)
- webapps/myapp/WEB-INF/lib folderu ma ASM-3.3.1.jar, Jackson-core-asl.jar, jersey-client JAR, jersey-core.jar, jersey-json.jar, jersey-server.jar, biblioteki Jersey servlet.jar
- dodać opcjonalny adnotacji-detector.jar jeśli używasz infomas-ASL narzędzia Discovery
jersey-archive.zip ma starszy plik asm-3.1.jar, prawdopodobnie działa dobrze, ale chapter_deps.html linki do nowszego pliku. Zobacz listę linków u góry.
Edycja Znalazłem doskonałe (szybkie, lekkie tylko 15KB) narzędzie do wykrywania adnotacji. Zobacz ten post na temat tego, jak automatycznie wykrywać typy w czasie wykonywania i nie trzeba już edytować RESTApplication za każdym razem, gdy dodawany jest nowy komponent bean java (jaxb).
https://github.com/rmuller/infomas-asl/issues/7
JAX-RS/Jersey nie obsługuje serializacji prymitywnych typów lub nawet typów otoki takich jak Integer, Boolean itd AFAIK, podejście zażycia wydaje się być jedynym sposobem. –
Okay, dziękuję! – Olvagor