我想在我的石英調度器頂部創建一個休息api服務器。我希望能夠將org.quartz.Trigger和org.quartz.JobDetail對象作爲JSON返回。問題是我無法將@XmlRootElement添加到這些類中,而無需重新編譯jar,這會導致未來升級等問題。我已經測試並能夠在添加@XmlRootElement時序列化類的列表,但是當我嘗試返回一個List我得到錯誤「Java類java.util.ArrayList的消息主體編寫器,Java類型java.util.List和MIME媒體類型application/json未找到」。我曾嘗試添加一個自定義MessageBodyWriter,但似乎並沒有解決問題。有沒有辦法將石英類編組爲JSON,而無需修改石英代碼來添加@XmlRootElement。我在一個嵌入式Web服務器中使用jetty btw。澤西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();
}
}
我去了你昨晚寫了這個問題後,使用相同的路徑,但遇到了一個問題,在觸發類的子接口。觸發器是一個接口,它包含JobKey等的子接口。我開始爲這些類創建@XmlJavaAdapters,但希望檢查答案。你提到有一種方法可以在澤西島配置它,但我不知道如何做到這一點。你能給我一個指針嗎?我嘗試了//handler.getInitParams().put("com.sun.jersey.api.json.POJOMappingFeature「,」true「);配置但它沒有工作。 –
有沒有更簡單的方法來完成這項任務?我真的不喜歡爲我所有的類編寫XmlJavaAdapters的想法。 –