gpt4 book ai didi

java - 带有外部类的 Jersey JSON 序列化

转载 作者:行者123 更新时间:2023-12-02 07:24:36 25 4
gpt4 key购买 nike

我正在尝试在我的quartz调度程序之上创建一个rest api服务器。我希望能够以 JSON 形式返回 org.quartz.Trigger 和 org.quartz.JobDetail 对象。问题是,我无法将 @XmlRootElement 添加到这些类,而不必重新编译 jar,这会导致 future 升级等出现问题。我已经测试过,并且能够在添加 @XmlRootElement 时序列化类列表,但是当我尝试返回列表 我收到错误“未找到 Java 类 java.util.ArrayList、Java 类型 java.util.List 和 MIME 媒体类型 application/json 的消息正文编写器”。我尝试添加自定义 MessageBodyWriter 但这似乎也无法解决问题。有没有一种方法可以将quartz类编码为JSON,而无需修改quartz代码来添加@XmlRootElement。我在带有 jetty 的嵌入式 Web 服务器中使用它。

@Path("/jobs")
public class JobsResource {

@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Trigger> listScheduledJobs() throws SchedulerException {
return TaskEngine.getInstance().listScheduledJobs();
}

}

网络服务器配置

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();
}
}

最佳答案

我认为您不能直接以 JSON 形式返回列表。您需要有一个包含此列表的包装类。例如尝试这样的事情

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class TriggerWrapper{

private List<Triggers> triggers;

public List<Triggers> getTriggers(){
if(triggers==null){
triggers = new ArrayList<Triggers>();
}
return triggers;
}
}

然后在您的休息服务类别中:

@Path("/jobs")
public class JobsResource {

@GET
@Produces(MediaType.APPLICATION_JSON)
public TriggerWrapper listScheduledJobs() throws SchedulerException {
TriggerWrapper response = new TriggerWrapper();
List<Triggers> triggers = TaskEngine.getInstance().listScheduledJobs();
response.getTriggers.addAll(triggers);
return response;
}

}

你的 json 会是这样的:

{
"triggerwrapper": {
"triggers": [
{
"triggerid": 1
},
{
"triggerid": 2
}
]
}
}

当然,如果你愿意,你可以从 json 中删除根元素标签,它可以在 jersey 中配置。

关于java - 带有外部类的 Jersey JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13716651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com