Quartz スケジューラーの上に REST API サーバーを作成しようとしています。org.quartz.Trigger および org.quartz.JobDetail オブジェクトを JSON として返せるようにしたいと考えています。問題は、jar を再コンパイルせずに @XmlRootElement をこれらのクラスに追加できないことです。これにより、将来のアップグレードなどで問題が発生します。テストしたところ、@XmlRootElement を追加するときにクラスのリストをシリアル化できましたが、 「Java クラス java.util.ArrayList、Java タイプ java.util.List、および MIME メディア タイプ application/json のメッセージ ボディ ライターが見つかりませんでした」というエラーが表示されます。カスタム MessageBodyWriter を追加しようとしましたが、それでも問題は解決しないようです。@XmlRootElement を追加するために Quartz コードを変更することなく、Quartz クラスを JSON にマーシャリングする方法はありますか。
@Path("/jobs")
public class JobsResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Trigger> listScheduledJobs() throws SchedulerException {
return TaskEngine.getInstance().listScheduledJobs();
}
}
Web サーバー構成
public class TaskEngineWebServer {
private static final Logger logger = Logger.getLogger(TaskEngineWebServer.class.getName());
private Server server;
public TaskEngineWebServer() {
this(8585);
}
public TaskEngineWebServer(Integer port) {
server = new Server(port);
logger.info("Configuring rest service to start at url /r");
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.NO_SECURITY);
//handler.getInitParams().put("com.sun.jersey.api.json.POJOMappingFeature", "true");
PackagesResourceConfig packagesResourceConfig = new PackagesResourceConfig("com.hp.vf.scheduler.server.rest");
ServletContainer servletContainer = new ServletContainer(packagesResourceConfig);
handler.addServlet(new ServletHolder(servletContainer), "/r/*");
server.setHandler(handler);
logger.info("Done configuring rest service");
}
public void start() throws Exception {
server.start();
}
public void stop() throws Exception {
server.stop();
}
public boolean isStarted() {
return server.isStarted();
}
public boolean isStopped() {
return server.isStopped();
}
}