Comment puis-je obtenir Groovy et JAXB jouer bien ensemble
J'essaie d'obtenir JAXB de travailler avec une classe groovy de la mine, cependant, il semble qu'il ne fonctionne pas, mais la version de java n'. Voici le code...
Voici les Scénarios:
Si 2 et 3 sont sans commentaire, il fonctionne très bien.
Si 1 et 4 sont sans commentaire-je obtenir:
com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:
2 counts of IllegalAnnotationExceptions
groovy.lang.MetaClass is an interface, and JAXB can't handle interfaces.
Si 1 et 5 sont sans commentaire-je obtenir:
javax.xml.bind.JAXBException: class org.oclc.presentations.simplejaxb.PlayerGroovy
nor any of its super class is known to this context.
Des idées?
Java:
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Player {
}
Groovy:
import javax.xml.bind.annotation.XmlRootElement
@XmlRootElement
public class PlayerGroovy {
}
Test:
import org.junit.Test
import javax.xml.bind.JAXBContext
import javax.xml.bind.Marshaller
import org.junit.Assert
class PlayerTest {
@Test
public void testJaXB(){
//1 PlayerGroovy player = new PlayerGroovy()
//2 Player player = new Player()
StringWriter writer = new StringWriter();
//3 JAXBContext context = JAXBContext.newInstance(Player.class);
//4 JAXBContext context = JAXBContext.newInstance(PlayerGroovy.class);
//5 JAXBContext context = JAXBContext.newInstance(PlayerGroovy.getClass());
Marshaller m = context.createMarshaller();
m.marshal(player, writer);
println(writer)
Assert.assertTrue(true)
}
}
Vous devez vous connecter pour publier un commentaire.
Décommentant la 1 et la 4 est la bonne manière de définir JAXB avec Groovy. La raison pour laquelle cela ne fonctionne pas, c'est que chaque Classe Groovy a une métaclasse propriété sur elle. JAXB essaie d'exposer cela comme un JAXB de la propriété qui, évidemment, ne parvient pas. Puisque vous ne déclarez pas la métaclasse propriété vous-même, il n'est pas possible d'annoter avoir JAXB l'ignorer. Au lieu de cela vous et l'ensemble XmlAccessType à AUCUN. Cette désactiver la JAXB d'auto-détection de propriétés à exposer comme des éléments XML. Après vous faites cela, vous avez besoin de déclarer explicitement les champs que vous souhaitez exposer.
Exemple:
J'ai eu le même problème tout en exposant un Graal GORM objet. Après des recherches sur la solution posté ci-dessus, à l'aide de
@XmlAccessorType( XmlAccessType.NONE )
, j'ai vite grandi fatigué de marquage, tout comme@XmlAttribute
.Je vais avoir beaucoup de succès en utilisant:
Voir: XmlAccessType
Grâce à l'originalité de réponse pour m'avoir fait un pas dans la bonne direction.
La solution ne semble pas fonctionner sur une sous-classe abstraite. Je pense que c'est parce que le compilateur ne génère pas le
getMetaClass
code de déblocage. J'ai fini imitant les étapes de cette question comme suit:Oui, c'est bizarre. Dans mon cas, j'ai un code comme ceci:
Et à exécuter mes scripts, j'ai:
Je préfère une meilleure solution, mais pour l'instant c'est tout ce que j'ai.