2009-07-21 13 views
20

JAXB'yi mükemmel bir sınıfla çalışmaya çalışıyorum, ancak işe yaramıyor ama java sürümü çalışıyor. uncommentedGroovy ve JAXB'yi birlikte güzel çalmak için nasıl alırım?

2 ise ve 3 iyi çalışıyor: İşte kod ... İşte

Senaryolar olmasıdır. 5 uncommented

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 
     2 counts of IllegalAnnotationExceptions 
groovy.lang.MetaClass is an interface, and JAXB can't handle interfaces. 

1 ise ve ben olsun:

javax.xml.bind.JAXBException: class org.oclc.presentations.simplejaxb.PlayerGroovy 
     nor any of its super class is known to this context. 

Herhangi bir fikir

1 ile 4 ise alıyorum uncommented?

Java:

import javax.xml.bind.annotation.XmlRootElement; 

    @XmlRootElement 
    public class Player { 
    } 

Groovy:

import javax.xml.bind.annotation.XmlRootElement 

    @XmlRootElement 
    public class PlayerGroovy { 
    } 

Testi:

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) 
     } 
    } 

cevap

21

uncommenting 1 ve 4 Groovy ile JAXB ayarlamak için doğru yoldur. Çalışmamanın nedeni, her Groovy Sınıfının üzerinde bir metaClass özelliği olmasıdır. JAXB, bunu açıkça başarısız olan bir JAXB özelliği olarak ortaya çıkarmaya çalışıyor. MetaClass özelliğini kendiniz bildirmediğinizden, JAXB'nin bunu görmezden gelmesi için ek açıklama eklemek mümkün değildir. Bunun yerine ve XmlAccessType öğesini YOK olarak ayarlayın. Bu devre dışı bırakma, JAXB'nin XML öğelerini gösterecek özelliklerin otomatik olarak keşfedilmesini sağlar. Bunu yaptıktan sonra, açıkta kalmak istediğiniz alanları açıkça bildirmeniz gerekir.

Örnek: Grails gorm maruz bırakma sırasında

@XmlAccessorType(XmlAccessType.NONE) 
@XmlRootElement 
public class PlayerGroovy { 
    @XmlAttribute 
    String value 
} 
+3

+1 Mükemmel cevap – skaffman

15

aynı sorunu vardı. Yukarıda yayınlanan çözümü araştırdıktan sonra, @XmlAccessorType(XmlAccessType.NONE) kullanarak, herşeyi @XmlAttribute olarak işaretlemekten yoruldum.

kullanıyorum bol başarılar yaşıyorum:

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
public class PlayerGroovy { 
    String value 
} 

Bkz: Beni doğru yönde başlatılan almak için orijinal cevaba XmlAccessType

teşekkürler.

+5

Dikkat edilmesi gerekenler bu etkiyi geri döndürüyor. XmlAccessType.FIELD, "String değeri" değerini, alıcılarda ve ayarlayıcılarda gerçekleşen herhangi bir manipülasyona döndürür. Bu yüzden bu kadar sevmiyorum. Ama evet, şeyleri daha az ayrıntılı hale getirir. – Jackie

1

Çözüm, soyut bir alt sınıf üzerinde çalışmıyor gibi görünüyor. Derleyicinin getMetaClass geçersiz kılma kodunu oluşturmaması nedeniyle düşünüyorum.

@XmlAccessorType(XmlAccessType.NONE) 
package groovy.lang; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 

Evet, biraz tuhaf: Ben şöyle this question itibaren adımları taklit sona erdi.

package pkg; 
abstract class ScriptMomma extends groovy.lang.Script { 
    // write some nice supporting code here 
} 

Ve komut dosyalarını yürütmek, ben: Benim durumumda, bu gibi bir kod var

def config = new org.codehaus.groovy.control.CompilerConfiguration() 
config.scriptBaseClass = 'pkg.ScriptMomma' 
ScriptMomma mine = new GroovyShell(config).evaluate(scriptFile, 'TheOne') 

Ben daha iyi bir çözüm tercih ediyorum, ama şu anda bu kadar varmaktadır.

+0

Bu kod da işe yarıyor gibi görünüyor, ancak gerçekten iyi bir fikir olup olmadığından emin değilim. 'metaclass metaclass = yeni DelegatingMetaClass (ayarlar) ' ' @ XmlTransient' 'metaclass getMetaClass() {' ' metaClass' '} ' – ngreen