Ошибка при реализации MOXy

Я получал циклическую ошибку в своих классах DTO, поэтому решил реализовать MOXy, чтобы избавиться от нее. Я выполнил следующие шаги для реализации MOXy:

  1. EclipseLink скачан с [http://www.eclipse.org/eclipselink/downloads/nightly.php]

  2. Скопировал все JAR-файлы из папки /eclipselink/jlib в мою /WEB-INF/lib

  3. Для указания EclipseLink MOXy в качестве провайдера JAXB был создан файл jaxb.properties в папке, где присутствуют все классы, со следующей записью:

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

Я использую аннотации @XmlElement и @XmlInverseReference в своих классах dto, но получаю следующую ошибку при запуске приложения:

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 

person Prats    schedule 08.07.2013    source источник
comment
Пожалуйста, помогите мне, я застрял в этом. Сработала ли эта штука MOXy для кого-нибудь?   -  person Prats    schedule 08.07.2013
comment
Какой сервер приложений вы используете?   -  person bdoughan    schedule 09.07.2013
comment
@BlaiseDoughan Я использую сервер Tomcat7. Я смог включить MOXy в свое приложение, но это не дает мне правильного результата. Я перешел по обеим вашим ссылкам для реализации аннотации XmlInverseReference: 1 (blog.bdoughan.com/2013/03/), 2) (stackoverflow.com/questions/3313454/). Но все же я получаю неправильный вывод. Я добавил ответ xml в вопрос. Пожалуйста, посмотрите   -  person Prats    schedule 09.07.2013
comment
@BlaiseDoughan В двух приведенных выше ссылках вы использовали два разных способа реализации элемента XmlInverseReference. Не могли бы вы сказать мне, какой из них правильный?   -  person Prats    schedule 09.07.2013
comment
Оба способа верны, все зависит от того, хотите ли вы, чтобы сопоставление было доступно для записи в обоих направлениях. Я добавил ответ для исправления неправильного вывода: я добавил ответ для исправления вывода: stackoverflow.com/a/17545727/383861 . Для новых вопросов открытие новых вопросов упрощает задачу, чем добавление к существующему вопросу.   -  person bdoughan    schedule 09.07.2013
comment
Ой.. буду делать это с этого момента   -  person Prats    schedule 09.07.2013


Ответы (2)


Чтобы ответить на ваш последующий вопрос, где вы получаете неправильный результат. Сопоставление environmentproperty на вашем 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. У меня нет другой отдельной программы для сортировки и десортировки объекта.

person bdoughan    schedule 09.07.2013
comment
Реализовал оба предложенных вами способа, но все равно получил тот же результат :( - person Prats; 09.07.2013
comment
@Prats - оба подхода будут работать. Я считаю, что проблема в том, что свойство не заполняется, когда вы его упорядочиваете. Как вы строите свой объект? - person bdoughan; 09.07.2013
comment
Я использую службу REST и реализацию JAXB с Джерси для этой работы. Пожалуйста, посмотрите РЕДАКТИРОВАТЬ - person Prats; 09.07.2013
comment
@Prats - Можете ли вы подтвердить, что в возвращаемом объекте заполнено отсутствующее свойство? - person bdoughan; 09.07.2013
comment
Я не получаю сведения о среде, заполненные в объекте ApplicationDTO. Я не знаю, почему? - person Prats; 09.07.2013
comment
@Prats - Как строится объект? - person bdoughan; 09.07.2013
comment
Дааааа, я понял проблему. Я указывал неверный внешний ключ в @JoinColumn(name=...). Я исправил и теперь работает нормально - person Prats; 09.07.2013
comment
Большое спасибо, что подумали со мной - person Prats; 09.07.2013

По какой-то причине ваш файл 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

Надеюсь, это поможет, Рик

person Rick Barkhouse    schedule 08.07.2013
comment
Я не получаю правильный вывод. Я отредактировал вопрос, пожалуйста, посмотрите. - person Prats; 09.07.2013
comment
@Prats - я добавил ответ, чтобы исправить вывод: stackoverflow.com/a/17545727/383861 - person bdoughan; 09.07.2013