bloggers bloggers

Marco Napolitano
Messaggi: 79
Stelle: 0
Data: 17/02/22
Jader Jed Francia
Messaggi: 63
Stelle: 0
Data: 18/02/21
Paolo Gambetti
Messaggi: 2
Stelle: 0
Data: 11/11/19
Katia Pazzi
Messaggi: 1
Stelle: 0
Data: 27/06/19
Ezio Lombardi
Messaggi: 11
Stelle: 0
Data: 10/04/18
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
Indietro

JAXB: Class has two properties of the same name

Le potenzialità del framework Metro (http://metro.java.net/discover/) facilitano indubbiamente le attività di esposizione di webservices, rendendo trasparenti passaggi laboriosi e time consuming.

In un contesto simile, è però facile perdere il controllo di "cosa succede di mezzo"; uno dei casi più frequenti è sicuramente un errore non esattamente verobse:

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions

Class has two properties of the same name "myProperty"

...eppure il mio DTO dichiara una sola property:

public class MyRequest {

    public MyBean myProperty = null;

    public MyBean getMyProperty() {
        return myProperty;
    }

    public void setSelectedHotel(MyBean myProperty) {
        this.myProperty = myProperty;
    }

}

L'XmlAccessorType di default è PUBLIC_MEMBER, il che comporta il bind automatico dei fields public e dei metodi public. Nella classe MyRequest la dichiarazione public del fileld myProperty di tipo MyBean interferisce con l'implementazione del getter.

Il caso esposto è quasi sicuramente identificabile come un errore di modellazione: vista la presenza dei metodi getter e setter di accesso al field, la soluzione al problema è la modifica della visiblità del field stesso da public a private:

public class MyRequest {

    private MyBean myProperty = null;

    public MyBean getMyProperty() {
        return myProperty;
    }

    public void setSelectedHotel(MyBean myProperty) {
        this.myProperty = myProperty;
    }

}

Nel caso in cui la soluzione proposta non sia praticabile, suggerisco l'utilizzo di @XmlTransient:

http://download.oracle.com/javaee/5/api/javax/xml/bind/annotation/XmlTransient.html

Precedente
Commenti
Aggiungi Commento
Davide Piazza
Grazie ragazzi, molto utile.
Non stavo lavorando in Liferay, nè in Metro, ma stavo mettendo in piedi dei JAX-WS puri da esporre tramite Mule ESB. Ho avuto proprio questo errore,ma la mia property era già private.
Ho applicato l'annotation @XmlTransient come suggerito et voitlà.
Inviato il 09/07/15 14.02.
Jader Jed Francia
Ciao Davide! ;)
Sono contento che ti siamo stati utili; non esitare a chiederci aiuto nel caso tu abbia bisogno di qualche cosa! ;)

A presto, ciao, J.
Inviato il 09/07/15 14.02 in risposta a Davide Piazza.