实现MOXy时出错

时间:2013-07-08 07:29:46

标签: java xml hibernate jaxb moxy

我的DTO课程中出现了循环错误,因此决定实施MOXy来摆脱它。我按照以下步骤实现了MOXy:

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

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

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

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

  4. 我在我的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 
    

2 个答案:

答案 0 :(得分:3)

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

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

希望这有帮助, 瑞克

答案 1 :(得分:2)

解决您的输出错误的后续问题。 environmentApplicationDTO属性的映射是错误的。您可以执行以下操作之一:

选项#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库自动创建对象。我没有任何其他单独的程序来编组和解组对象。