我的DTO课程中出现了循环错误,因此决定实施MOXy来摆脱它。我按照以下步骤实现了MOXy:
从[ http://www.eclipse.org/eclipselink/downloads/nightly.php ]下载EclipseLink
将/ eclipselink / jlib文件夹中的所有JAR复制到我的/ WEB-INF / lib
用于指定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
答案 0 :(得分:3)
由于某种原因,您的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
希望这有帮助, 瑞克
答案 1 :(得分:2)
解决您的输出错误的后续问题。 environment
上ApplicationDTO
属性的映射是错误的。您可以执行以下操作之一:
选项#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库自动创建对象。我没有任何其他单独的程序来编组和解组对象。