【问题标题】:Error while implementing MOXy's实施 MOXy 时出错
【发布时间】:2013-07-05 11:05:29
【问题描述】:

我在 DTO 类中遇到循环错误,因此决定实施 MOXy 以摆脱它。我按照以下步骤实施 MOXy:

  1. 从 [http://www.eclipse.org/eclipselink/downloads/nightly.php] 下载 EclipseLink

  2. 将所有 JAR 从 /eclipselink/jlib 文件夹复制到我的 /WEB-INF/lib

  3. 为了将 EclipseLink MOXy 指定为 JAXB 提供程序,在所有类都存在的文件夹中创建了一个 jaxb.properties 文件,其中包含以下条目 -

    javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

我在我的 dto 类中使用 @XmlElement 和 @XmlInverseReference 注释,但在运行我的应用程序时出现以下错误:

javax.ws.rs.WebApplicationException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions, Class has two properties of the same name "application"
this problem is related to the following location:
    at public thbs.provisioning.dto.ApplicationDTO thbs.provisioning.dto.EnvironmentDTO.getApplication()
    at thbs.provisioning.dto.EnvironmentDTO
    at public java.util.Set thbs.provisioning.dto.ApplicationDTO.getEnvironment()
    at thbs.provisioning.dto.ApplicationDTO
this problem is related to the following location:
    at private thbs.provisioning.dto.ApplicationDTO thbs.provisioning.dto.EnvironmentDTO.application
    at thbs.provisioning.dto.EnvironmentDTO
    at public java.util.Set thbs.provisioning.dto.ApplicationDTO.getEnvironment()
    at thbs.provisioning.dto.ApplicationDTO 

【问题讨论】:

  • 请帮帮我,我被困住了。这个 MOXy 东西对任何人有用吗?
  • 你使用的是哪个应用服务器?
  • @BlaiseDoughan 我正在使用 Tomcat7 服务器。我能够在我的应用程序中包含 MOXy,但它没有给我正确的输出。我已经关注了您实现 XmlInverseReference 注释的两个链接:1 (blog.bdoughan.com/2013/03/…)、2) (stackoverflow.com/questions/3313454/…)。但是,我仍然得到错误的输出。我在问题中添加了 xml 响应。请看一下
  • @BlaiseDoughan 在上面的两个链接中,您遵循了两种不同的方式来实现 XmlInverseReference 元素。你能告诉我哪个是正确的方法吗?
  • 两种方式都是正确的,这完全取决于您是否希望映射在两个方向上都是可写的。我添加了解决错误输出的答案:我添加了更正输出的答案:stackoverflow.com/a/17545727/383861。对于新问题,打开新问题比添加到现有问题更容易。

标签: java xml hibernate jaxb moxy


【解决方案1】:

解决您得到错误输出的后续问题。 ApplicationDTO 上的 environmentproperty 映射错误。您可以执行以下操作之一:

选项 #1 - @XmlElementRef

如果您使用@XmlElementRef 注释,则此属性的元素名称将基于目标类上的@XmlRootElement 注释。

@OneToMany(mappedBy = "application", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@XmlElementRef
public Set<EnvironmentDTO> getEnvironment() {
    return environment;
}

选项 #2 - @XmlElement

或者,您可以使用 @XmlElement 注释来指定应该用于属性的元素。

@OneToMany(mappedBy = "application", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@XmlElement(name="environmentDTO")
public Set<EnvironmentDTO> getEnvironment() {
    return environment;
}

编辑:

@GET
@Path("/get")
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public List<ApplicationDTO> getAllApplications(){
    List<ApplicationDTO> allApplication = applicationService.getAllApplication();
    return allApplication;
}

从这里流到下面的类:

@Override
public List<ApplicationDTO> getAllApplication() {

    List<ApplicationDTO> AppList = genericDAOTxService.findAll(ApplicationDTO.class);   
    return AppList;     
}

比下面的类:

@Override
@Transactional(rollbackFor = java.lang.Exception.class, noRollbackFor = java.io.FileNotFoundException.class, propagation = Propagation.REQUIRES_NEW)
public <T> List<T> findAll(Class<T> type) {
    List<T> list = genericDAOImpl.findAll(type);
    return list;
}

然后,从数据库中填充值。

以前,即在使用 MOXy 之前,我曾经在 ApplicationDTO 对象中获得以下信息:

[ApplicationDTO [applicationId=1, applicationName=name, applicationDescription=desc, owner=5, createTime=2013-05-06 15:29:15.0, environment=[EnvironmentDTO [environmentId=1, environmentName=envname]]], ApplicationDTO [applicationId=2, applicationName=name, applicationDescription=desc, owner=5, createTime=2013-05-28 19:07:10.0, environment=[EnvironmentDTO [environmentId=2, environmentName=envname]]]]

但是,现在我在 ApplicationDTO 对象中得到了关注:

[ApplicationDTO [applicationId=1, applicationName=name, applicationDescription=desc, owner=5, createTime=2013-05-06 15:29:15.0], ApplicationDTO [applicationId=2, applicationName=name, applicationDescription=desc, owner=5, createTime=2013-05-28 19:07:10.0]]

这是我的应用程序的实际流程,对象是使用 JAXB 和 Jersy 库自动创建的。我没有任何其他单独的程序来编组和解组对象。

【讨论】:

  • 实现了你建议的两种方式,但仍然得到相同的结果:(
  • @Prats - 这两种方法都可以。我认为问题在于,当您将其编组时,该属性没有被填充。你是如何构建你的对象的?
  • 我正在使用 REST 服务和带有 Jersey 的 JAXB 实现来完成这项工作。请看一下编辑
  • @Prats - 你能确认返回的对象是否填充了缺失的属性吗?
  • 是的,我发现了问题所在。我在@JoinColumn(name="...") 中给出了错误的外键。我纠正了它,现在它工作正常
【解决方案2】:

由于某种原因,您的jaxb.properties 文件未被拾取——错误消息中的“com.sun.xml.bind.v2.runtime”表明 Sun JAXB 正在运行,而不是 MOXy。

确保jaxb.properties 位于与模型类相同的包中的类路径中。如果您在源目录中包含jaxb.properties,请确保将其复制到您的.class 文件所在的同一目录中。您可以在此处阅读有关设置 jaxb.properties 的信息:http://www.eclipse.org/eclipselink/documentation/2.5/moxy/runtime.htm#sthref8

希望这会有所帮助, 瑞克

【讨论】:

猜你喜欢
  • 2018-06-07
  • 2018-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多