Jersey に適切な JSON ドキュメント (自然な json) を生成するように指示します。Rest アプリと JAXBContext リゾルバーに同じクラスを使用していますが、これが最もクリーンなカプセル化であることがわかりました。
より優れたプログラマーは、ヘルパーを実装して .class ファイルを反復処理し、@Annotation タグを識別することで適切なクラスを自動的にリストできます。独自のソースコードで実行する方法がわかりません。
これらの 2 つのリンクは、この余分な 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 があることを期待して、特別なことは何もありません。この Java 専門用語の後、JSON ドキュメントは
- ゼロまたは単一要素のリスト配列は、常に json 配列 ([] フィールド) として書き込まれます。
- プリミティブ整数とブール フィールドは、json プリミティブとして記述されます (引用符なし)。
以下の環境を使用しています
- サン Java JDK1.6.x
- アパッチ トムキャット 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 ライブラリ
- infomas-asl 検出ツールを使用する場合は、オプションの annotation-detector.jar を追加します
jersey-archive.zip には古い asm-3.1.jar ファイルがあり、おそらく正常に動作しますが、 chapter_deps.html は新しいファイルにリンクしています。上部のリンクリストを参照してください。
編集
優れた (高速で軽量、わずか 15KB) 注釈発見ツールを見つけました。実行時に型を自動検出し、新しい Java(jaxb) Bean が追加されるたびに RESTApplication を編集する必要がなくなった方法については、この投稿を参照してください。
https://github.com/rmuller/infomas-asl/issues/7