我想在我的石英调度器顶部创建一个休息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的想法。 –