【问题标题】:Jaxb/Jersey servlet data isn't being returned correctlyJaxb/Jersey servlet 数据未正确返回
【发布时间】:2014-07-21 21:50:54
【问题描述】:

我有一个使用 Jaxb/Jersey 的小型 tomcat servlet。 post 处理程序返回一个包含其他对象的对象。当结果返回给调用者时,包含的对象大部分为空——即使它们在 servlet 中不为空。

-- 小服务程序--

@POST
@Consumes(MediaType.APPLICATION_XML)
@Produces(MediaType.APPLICATION_XML)
public Response postPlan( JAXBElement<String> mxml) throws IOException {
    iMetrix metrix_MIS = Metrix_MIS_Implementation.getInstance();
    iMetrix_GeneratePlan_Response result = metrix_MIS.generatePlan(mxml.getValue());

    PlanData data = new PlanData();
    data.setJunk("Testing Junk");
    data.setGuid(result.getProjectID());
    data.setLog((Metrix_Log_Implementation) result.getLog());
    InputStream planStream = result.getPlanZipStream();
    if (planStream != null) {
        data.setPlanXML(IOUtils.readFully(planStream, -1, true));
    }

    result.getLog().dump(System.out);

    return Response.ok(data).build();
}

--调用应用--

        Client client = ClientBuilder.newClient();
    WebTarget web = client.target(url);
    Entity<String> entity = Entity.entity(mxmlProjectString, MediaType.APPLICATION_XML_TYPE);
    Response resp = web.request(MediaType.APPLICATION_XML_TYPE).post(entity);
    int status = resp.getStatus();
    System.out.println(status + "-" + resp.getStatusInfo().toString());
    System.out.println(resp.toString());
    System.out.println(resp.readEntity(String.class));

servlet 从 getLog().dump() 行打印出一堆数据。 调用者只是得到一个空的日志对象:

200-OK
InboundJaxrsResponse{ClientResponse{method=POST, uri=http://192.168.187.128:8080/MetrixServer/rest/Plan/v1, status=200, reason=OK}}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><planData><junk>Testing Junk</junk><log/></planData>

那么,我错过了什么?

PlanData 是:

@XmlRootElement
public class PlanData {
  private String                guid;
  private byte[]                planXML;
  private Metrix_Log_Implementation log;
  private String                junk;
... getters/setters left out...

Metrix_Log_Implementation:

@XmlRootElement(name = "MetrixLog")
public class Metrix_Log_Implementation implements iMetrix_Log {
... stuff...
  @XmlRootElement(name = "LogLine")
  private static class Metrix_LogLine_Implementation implements iMetrix_LogLine {
    private eLogLineType    m_type;
    private String      m_message;
    private String      m_MISID;
... more stuff ...

一个奇怪的地方是私有内部类和枚举的使用。但这不应该有效吗?

【问题讨论】:

  • 我会注释掉所有的嵌套类和枚举,看看你是否能得到任何包含日志条目的响应......你可能还想在这些对象中添加一些垃圾值只是为了确保将这些对象包含在输入中。一旦你弄清楚问题出在哪里,你就可以从那里开始。
  • 这是我希望避免的,因为许多其他类也使用这些。破坏其他东西的可能性太多。我最终只是创建了一组非常简单的数据保存类,并将数据复制到/从它们中复制。那些更简单的类转换为 XML 或从 XML 转换就好了。

标签: java tomcat servlets jaxb jersey


【解决方案1】:

不确定到底是半复杂类结构的哪一部分导致了问题。如果在某处生成某种错误消息当然会很好。 我刚刚创建了要传输的简单数据类,并在任一端将数据复制到/从更复杂的类中复制。

【讨论】:

    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    相关资源
    最近更新 更多