2014-02-08 5 views
1

Хорошо, я пробовал это в течение нескольких дней подряд, но, похоже, не понял, что случилось. Основная идея здесь в том, что я пытаюсь создать спокойную веб-службу, которая будет отображать свойства двух сущностей, имеющих множественные двунаправленные отношения друг с другом. Теперь я хочу использовать moxy-реализацию JAXB, чтобы использовать аннотацию @XmlInverseReference для поддержки ссылочной целостности, но продолжайте придумывать исключения. ниже является исключением из моих классов я использую GlassFish 3.1.1 и Moxy EclipseLink 2.3.0ошибки marshalling аннотированный класс с moxy

Passenger Class: 

package kharesoft.sita; 

import java.io.Serializable; 
import java.util.Date; 
import java.util.List; 
import java.util.Set; 
import javax.persistence.*; 
import javax.xml.bind.annotation.*; 


@XmlRootElement 
@XmlType(propOrder = {"id", "firstName", "lastName", "boardingNo", "seatNo", "flightNo", "dateOfFlight", "bags"}) 
@Entity 
@NamedQuery(name = "findPaxByBagTag", query = "select p from Passenger p,IN (p.bags) b where b.bagTagNo=:bagTagNo") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Passenger implements Serializable { 

    @XmlElement 
    private String firstName; 
    @XmlElement 
    private String lastName; 
    @XmlElement 
    private String boardingNo; 
    @XmlElement 
    private String seatNo; 
    @XmlElement 
    private String flightNo; 
    @XmlElement 
    @Temporal(javax.persistence.TemporalType.DATE) 
    private Date dateOfFlight; 
    @XmlElementWrapper 
    @XmlElements({ 
    @XmlElement(name = "bagtag")}) 
    @OneToMany(mappedBy = "passenger") 
    private Set<Bag> bags; 
    private static final long serialVersionUID = 1L; 
    @XmlElement 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Set<Bag> getBags() { 
     return bags; 
    } 

    public void setBags(Set<Bag> bags) { 
     this.bags = bags; 
    } 

    //Remaining getters and setters not shown 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Passenger)) { 
      return false; 
     } 
     Passenger other = (Passenger) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "kharesoft.sita.Passenger[ id=" + id + " ]"; 
    } 
} 


Bag Class: 


package kharesoft.sita; 

import java.io.Serializable; 
import javax.persistence.*; 
import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import org.eclipse.persistence.oxm.annotations.XmlInverseReference; 


@XmlRootElement 
@Entity 
@NamedQuery(name = "findBagWithTagNo", query = "select b from Bag b where b.bagTagNo=:bagTagNo") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Bag implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @XmlElement 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
    @XmlElement 
    private String bagTagNo; 
    @XmlElement 
    @ManyToOne 
    private Passenger passenger; 


    //other getters and setters not shown 

    @XmlInverseReference(mappedBy = "bags") 
    public Passenger getPassenger() { 
     return passenger; 
    } 

    public void setPassenger(Passenger passenger) { 
     this.passenger = passenger; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof Bag)) { 
      return false; 
     } 
     Bag other = (Bag) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() {   
     return bagTagNo; 
    } 
} 

Исключение:

СИЛЬНЫЙ: Подключенные исключение ответа: 500 (Внутренняя ошибка сервера) javax. ws.rs.WebApplicationException: javax.xml.bind.JAXBException: Исключение Описание: Дублируемое свойство с именем [пассажир], найденное в классе [kharesoft.sita.Bag] - со связанным исключением: [Исключение [EclipseLink-50072] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.JAXBException Исключение Описание: Дублируемое свойство с именем [пассажир], найденное в классе [kharesoft.sita.Bag]] на com.sun.jersey.core.provider.jaxb.AbstractListElementProvider.writeTo (AbstractListElementProvider.java:183) на com.sun .jersey.spi.container.ContainerResponse.write (ContainerResponse.java:306) на com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest (WebApplicationImpl.java:1437) на com.sun.jersey.server .impl.application.WebApplicationImpl.handleRequest (WebApplicationImpl.java:1349) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest (WebApplicationImpl.java:1339) at com.sun.jersey.spi.container .servlet.WebComponent.service (WebComponent.java:416) на com.sun.jersey.spi.container.servlet.ServletContainer. службы (ServletContainer.java:537) на com.sun.jersey.spi.container.servlet.ServletContainer.service (ServletContainer.java:699) по адресу javax.servlet.http.HttpServlet.service (HttpServlet.java:847) на org.apache.catalina.core.StandardWrapper.service (StandardWrapper.java:1539) на org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:281) на org.apache.catalina.core. StandardContextValve.invoke (StandardContextValve.java:175) на org.apache.catalina.core.StandardPipeline.doInvoke (StandardPipeline.java:655) на org.apache.catalina.core.StandardPipeline.invoke (StandardPipeline.java:595) на com.sun.enterprise.web.WebPipeline.invoke (WebPipeline.java:98) на com.sun.enterprise.web.PESessi onLockingStandardPipeline.invoke (PESessionLockingStandardPipeline.java:91) at org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:162) at org.apache.catalina.connector.CoyoteAdapter.doService (CoyoteAdapter.java:330) at org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper.service (ContainerMapper.java:174) at com.sun. grizzly.http.ProcessorTask.invokeAdapter (ProcessorTask.java:828) at com.sun.grizzly.http.ProcessorTask.doProcess (ProcessorTask.java:725) at com.sun.grizzly.http.ProcessorTask.process (ProcessorTask. java: 1019) at com.sun.grizzly.http.DefaultProtocolFilter.execute (DefaultProtocolFilter.java:225) в com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter (DefaultProtocolChain.java:137) в com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.java:104) в com.sun.grizzly.DefaultProtocolChain.execute (DefaultProtocolChain.Java: 90) на com.sun.grizzly.http.HttpProtocolChain.execute (HttpProtocolChain.java:79) на com.sun.grizzly.ProtocolChainContextTask.doCall (ProtocolChainContextTask.java:54) в com.sun.grizzly. SelectionKeyContextTask.call (SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run (ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork (AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool $ Worker.run (AbstractThreadPool.java:513) at java.lang.Thread.run (Thread.java:722) Вызвано: javax.xml.bind.JAXBException: Исключение Описание: Дублируемое свойство с именем [пассажир], найденное по классу [kharesoft.sita.Bag] - со связанным exce ption: [Исключение [EclipseLink-50072] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.JAXBException Исключение Описание: Дублирующее свойство с именем [пассажир] найдено в классе [kharesoft.sita .Bag]] в org.eclipse.persistence.jaxb.JAXBContext $ TypeMappingInfoInput.createContextState (JAXBContext.java:825) в org.eclipse.persistence.jaxb.JAXBContext. (JAXBContext.java:136) в org.eclipse .persistence.jaxb.JAXBContextFactory.createContext (JAXBContextFactory.java:142) на org.eclipse.persistence.jaxb.JAXBContextFactory.createContext (JAXBContextFactory.java:129) в org.eclipse.persistence.jaxb.JAXBContextFactory.createContext (JAXBContextFactory .java: 93) at org.eclipse.persistence.jaxb.JAXBContextF actory.createContext (JAXBContextFactory.java:83) на sun.reflect.NativeMethodAccessorImpl.invoke0 (нативный метод) на sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:57) в sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl .java: 43) at java.lang.reflect.Method.invoke (Method.java:601) at javax.xml.bind.ContextFinder.newInstance (ContextFinder.java:263) at javax.xml.bind.ContextFinder .newInstance (ContextFinder.java:250) at javax.xml.bind.ContextFinder.find (ContextFinder.java:400) at javax.xml.bind.JAXBContext.newInstance (JAXBContext.java:652) at javax.xml .bind.JAXBContext.newInstance (JAXBContext.java:599) at com.sun. jersey.core.provider.jaxb.AbstractJAXBProvider.getStoredJAXBContext (AbstractJAXBProvider.java:189) на com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getJAXBContext (AbstractJAXBProvider.java:182) на com.sun.jersey. core.provider.jaxb.AbstractJAXBProvider.getMarshaller (AbstractJAXBProvider.java:160) на com.sun.jersey.core.provider.jaxb.AbstractJAXBProvider.getMarshaller (AbstractJAXBProvider.java:139) на com.sun.jersey.core. provider.jaxb.AbstractListElementProvider.writeTo (AbstractListElementProvider.java:175) ... 33 еще Вызвано: Исключение [EclipseLink-50072] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence. exceptions.JAXBException Исключение Описание: Duplicate Property с именем [пассажир], найденным в классе [kharesoft.sita.Ba g] at org.eclipse.persistence.exceptions.JAXBException.duplicatePropertyName (JAXBException.java:943) at org.eclipse.persistence.jaxb.compiler.TypeInfo.addProperty (TypeInfo.java:265) at org.eclipse. persistence.jaxb.compiler.TypeInfo.setProperties (TypeInfo.java:292) at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.buildTypeInfo (AnnotationsProcessor.java:677) at org.eclipse.persistence.jaxb.compiler. AnnotationsProcessor.postBuildTypeInfo (AnnotationsProcessor.java:591) на org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.buildNewTypeInfo (AnnotationsProcessor.java:4050) на org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.processPropertyTypes (AnnotationsProcessor. java: 858) at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.processClassesAndProperties (AnnotationsProcessor.java:233) at org.eclipse.persistence.jaxb.compiler.Generator. (Generator.java:147) at org.eclipse.persistence.jaxb.JAXBContext $ ТипMappingInfoInput.createContextState (JAXBContext.java:822) ... 52 еще

Элементы экрана скрыты от вида. Нажмите Esc или переместите указатель в центр экрана, чтобы вернуться в Mail. Нажмите Esc или переместите указатель сюда, чтобы вернуться в Mail.by по  от WineSo свежий и чистый. AllPhotoColor

ответ

0

Поскольку вы указали @XmlAccessorType(XmlAccessType.FIELD) на Bag класса вы должны переместить @XmlInverseReference аннотацию к полю. Так как это свойство, MOXy думает, что вы хотите отобразить как поле, так и свойство, и жалуется, потому что у них одинаковое имя.

+0

Спасибо Doughan. Я уже сделал это, но получил исключение unsupportedProperty. – kharesoft