2010-12-06 35 views
3

BlazeDS ne sérialisera pas une propriété sauf si elle possède à la fois un getter et un setter. Cependant, plusieurs de mes propriétés Java sont en lecture seule. Par conséquent, je dois maintenant ajouter des setters pour soutenir le processus Unmarshalling. Si l'un des utilisateurs de ces objets de domaine commence à appeler ces setters eux-mêmes, il va casser la sémantique valeur-objet de ces choses et causer probablement toutes sortes de problèmes de système.Comment arrêter d'écrire des paramètres de propriété Java pour BlazeDS et JPA que je ne veux pas?

J'ai dû faire beaucoup de choses sur le passé pour supporter certains aspects de JPA et je n'ai jamais aimé ça. C'est parce que nous avons mis nos annotations JPA sur les propriétés plutôt que sur les champs privés (pour éviter un autre problème).

A part d'utiliser Javadoc pour m'avertir moi-même et les autres, que fait un programmeur?

Edit: Je dois ajouter que ces setters supplémentaires ne font PAS partie de l'interface publique que ces objets implémentent .... mais ils sont toujours là.

+0

"C'est parce que nous avons mis nos annotations JPA sur les propriétés plutôt que sur les champs privés (pour éviter un autre problème)" - quel était l'autre problème? –

+0

Le problème était les champs privés dans les superclasses mappées qui avaient utilisé des génériques Java dans leur type (par exemple 'private List myProp;'). Voir http://stackoverflow.com/questions/2808251/how-to-handle-jpa-annotations-for-a-pointer-to-a-generic-interface Ces déclarations ne prennent pas en charge les annotations JPA. – HDave

Répondre

1

Vous avez plusieurs options: utilisez votre propre mécanisme de sérialisation ou utilisez BlazeDS version 4. J'ai écrit un petit article sur ce sujet, peut-être qu'il peut vous aider. Le lien est http://cornelcreanga.com/2009/09/blazeds-amf-and-read-only-properties/.

+0

Great article. En ce qui concerne BlazeDS 4, existe-t-il un lien Web pour publier des notes? De plus, je vois que spring-flex 1.5.0-M1 fonctionne avec BlazeDS 4 mais je ne trouve aucun d'entre eux dans un dépôt Maven ... dois-je l'ajouter manuellement à mon Nexus? Merci! – HDave

+0

Peu importe ... trouvé les notes de publication et le commentaire sur la prise en charge des propriétés en lecture seule: http://opensource.adobe.com/wiki/display/blazeds/BlazeDS+4.0+Release+Notes – HDave

2

Vous pouvez essayer d'utiliser l'annotation @Access. Ceci est utilisé pour remplacer le type d'accès utilisé pour la classe colonne par colonne. Il vous permet également de jouer avec des choses quand il va à la base de données, comme ceci:

private String firstName; 

@Access(AccessType.PROPERTY) 
@Column(name="FIRST_NAME") 
protected String getFirstNameForDatabase() { 
    return "Mr. " + this.firstName; 
} 

Cet exemple remplace non seulement l'accès « champ » utilisé pour la classe, mais elle provoque aussi la base de données de commettre avec " M. "préfixé sur la valeur à chaque fois. Cela peut également vous permettre de déclarer des getters/setters 'factices' qui satisfont vos autres exigences sans foirer les validations et récupérations de l'APP. Essayez-le et voyez si cela peut être utilisé pour élaborer une solution à votre problème.

+0

Dans mon cas, l'utilisation de AccessType.Field sur certaines de ces propriétés peut être un moyen de se débarrasser des setters JPA indésirables. Une idée concernant les setters BlazeDS? – HDave

+0

Désolé, je n'ai aucune expérience BlazeDS –