JAX WS - Aggregat-Objekte

fsicher

Bekanntes Mitglied
Hallo allerseits!

Irgendwie bringe ich es nicht fertig, dass mein Objekt, das von der WebService-Methode zurückgeliefert wird, zum Client korrekt übertragen wird.

Die Klasse Address:
Java:
package test;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@Entity
@XmlRootElement(name = "address")
@XmlType(propOrder = { "id", "street", "zip", "city", "country" })
public class Address implements Serializable, Cloneable {

	private static final long serialVersionUID = 8525167027806199483L;

	@Id
	@GeneratedValue
	private int id;
	private String street;
	private int zip;
	private String city;
	private String country;

	public Address() {

	}

	/**
	 * @param street
	 * @param zip
	 * @param city
	 * @param country
	 */
	public Address(String street, int zip, String city, String country) {
		this.street = street;
		this.zip = zip;
		this.city = city;
		this.country = country;
	}

	// Set- und Get-Methoden ...
	
}

Die Klasse Person:
Java:
package test;

import java.io.Serializable;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@Entity
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "id", "firstName", "lastName", "username", "password", "address", "phone", "email" })
public class Person implements Serializable, Cloneable {

	private static final long serialVersionUID = 5994436635037432873L;

	@Id
	@GeneratedValue
	private int id;
	private String firstName;
	private String lastName;
	@Column(unique = true)
	private String username;
	private String password;

	// @XmlElement(name = "address")
	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	private Address address;
	private String phone;
	private String email;

	public Person() {

	}

	/**
	 * @param firstName String
	 * @param lastName String
	 * @param username String
	 * @param password String
	 * @param address Address
	 * @param phone String
	 * @param email String
	 */
	public Person(String firstName, String lastName, String username,
			String password, Address address, String phone, String email) {
		this();
		this.firstName = firstName;
		this.lastName = lastName;
		this.username = username;
		this.password = password;
		this.address = address;
		this.phone = phone;
		this.email = email;
	}

	// Set- und Get-Methoden 
	
}

Die WebService-Methode allPerson sieht wie folgt aus:
Java:
@WebMethod
public List<Person> allPerson() throws Exception {
	List<Person> l = PersonManager.findAll();

	// Zur Kontrolle 
	for (Person p: l){
	    System.out.prontln(p);
	}

	return l;
}

Wenn ich z.B. eine Person oder alle Personen abfrage, bekomme ich alle Personen, aber ohne Adressen. Ist etwas mit meinen Annotationen hier falsch? Oder, wo könnte das Problem liegen? Denn, bevor die Liste mit Personen zurückgeliefert wird, sind Person-Objekte (in der WebService-Methode allPerson) vollständig (mit Address-Objekten).

Danke.
 

DerFeivel

Bekanntes Mitglied
Hi,


ich habe gerade mal ein Minimalbeispiel aus deinen Quelltext-Bruckstücken zusammengebaut und in der Methode allPerson ein Person-Objekt mit Address-Objete per Hand erzeugt und zurückgegeben.

Deployed habe ich das Ganze auf einem JBoss 6.1.

Eine Anfrage mit SoapUI lieferte mir auch ein Person-Objekt samt Address-Unterobjekt/Element zurück.


Womit fragst du den Service ab? Auch mit SoapUI oder mit einem selbstgeschrieben Client? Wenn letzteres der Fall ist, solltest du nochmal mit SoapUI gucken, da ich dann den Fehler im Client vermuten würde.
 

fsicher

Bekanntes Mitglied
Vielen Dank.

Ja, ich habe den Client selbst implementiert, als Serverer benutzte ich den mitgelieferten Server (RI metro). Und, ich habe eine ähnliche Anwendung mit dem selbstgeschriebenen Client vor ein paar Monate implementiert, die funktionierte aber einwandfrei. Der einzige Unterschied ist, dass ich damals mit JDK 1.6.x gearbeitet habe, jetz aber mit JDK 1.7.x. Ein Quervergleich hat nichts ergeben, was verdächtig sein könnte.

SoapUI kenne ich nicht, werde es mir aber jetzt anschauen.
 

fsicher

Bekanntes Mitglied
Falls jemand mit dem Problem auch kämpfen sollte ...

Ich habe es jetzt mit SoapUI versucht und es hat funktioniert. Mein Problem ist aber, dass ich auch einen einfachen Java-Client zur Verfügung stellen muss ...

Nach langem Suchen habe ich herausgefunden, dass die Annotation @XmlRootElement Probleme verursacht hat. Nachdem ich diese Annotation aus der Klasse Address entfernt habe, hat es auch mit mienem selbstgeschriebenem Client funktioniert. Die Annotation @XmlRootElement markiert das äusere XML-Element und darf somit nicht in der Klasse vorkommen, deren Instanzen als Aggregat-Objekte (innere XML-Elemente) in anderen Klassen vorkommen:

Top-level Elements: XmlRootElement
A class that describes an XML element that is to be a top-level element, i.e., one that can function as an XML document, should be annotated with XmlRootElement.


Mehr dazu:
section_6_2_1-A-Survey-Of-JAXB-Annotations.html &mdash; Java.net
 

Ähnliche Java Themen

Neue Themen


Oben