views:

286

answers:

2

I use Java Persistence, and I want a web method to return a 'portion' of an Entity class. For example, I have a Customer class that represents a record in Customer table with many fields, but I want to return just few of them. Is it possible to use mapping to do that? Or the only way is to create a new class (maybe a superclass for Customer) that has only fields I want to return? I tried binding, but it didn't work (apparently I did it in a wrong way):

@Entity  
@Table(name = "Customer", catalog = "test", schema = "")
@XmlType(name = "Customer")
public class Customer implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")  
@XmlElement  
private Integer accountId;

@Basic(optional = false)    
@Column(name = "username")
@XmlElement
private String username;

@Basic(optional = false)
@Column(name = "password")
private String password;

I thought that if I don't add @XmlElement annotation to password field, it won't be included into result. However, I got a bunch of "Class has two properties of the same name" errors during deployment.

+2  A: 

This is because the default behaviour for XML generation is PUBLIC_MEMBER (http://java.sun.com/javaee/5/docs/api/javax/xml/bind/annotation/XmlAccessorType.html).

Since you are putting the @XmlElement on the fields, it is grabbing both your public getter/setter methods AND any field w/ @XmlElement on it. What you're likely going to want to is set the XmlAccessorType to either FIELD or NONE.

Neil McF
A: 

Annotate the class with

@XmlAccessorType(XmlAccessType.NONE)

Then annotate the fields you want to send with

@XmlElement(name="field_name")

There's actually a JAXB issue (that I can't find the reference to right now) that basically says that if you will be reading from XML, you'll want to annotate the setters and not the fields themselves.

gmoore