Вопрос по java, groovy, jaxb – Как заставить Groovy и JAXB хорошо играть вместе?

20

Я пытаюсь заставить JAXB работать с моим классным классом, однако, похоже, что он не работает, а java-версия работает. Вот код ...

Вот сценарии:

Если 2 и 3 не закомментированы, это работает отлично.

Если 1 и 4 не прокомментированы, я получаю:

 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 и 5 не прокомментированы, я получаю:

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

Есть идеи?

Джава:

    import javax.xml.bind.annotation.XmlRootElement;

    @XmlRootElement
    public class Player {
    }

Groovy:

    import javax.xml.bind.annotation.XmlRootElement

    @XmlRootElement
    public class PlayerGroovy {
    }

Тестовое задание:

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

Ваш Ответ

3   ответа
21

щью Groovy. Причина, по которой он не работает, заключается в том, что у каждого класса Groovy есть свойство metaClass. JAXB пытается представить это как свойство JAXB, которое явно не работает. Поскольку вы не объявляете свойство metaClass самостоятельно, аннотировать его невозможно, чтобы JAXB проигнорировал его. Вместо этого вы и установите XmlAccessType в NONE. Это отключает автоматическое обнаружение свойств JAXB для представления в виде XML-элементов. После этого вам нужно явно объявить любые поля, которые вы хотите открыть.

Пример:

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

После исследования решения, опубликованного выше, используя@XmlAccessorType( XmlAccessType.NONE )Я быстро устал маркировать все как@XmlAttribute.

Я добился большого успеха, используя:

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

Увидеть:XmlAccessType

Спасибо за оригинальный ответ, который помог мне начать в правильном направлении.

Следует отметить, что это влияет на то, что возвращается. XmlAccessType.FIELD возвращает значение & quot; String value & quot; не любые манипуляции, которые происходят в геттерах и сеттерах. Вот почему мне так не нравится. Но да, это делает вещи менее многословными. Jackie
1

что это потому, что компилятор не генерируетgetMetaClass переопределить код. Я заканчивал тем, что подражал шагам отэтот вопрос следующее:

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

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

Да, это немного странно. В моем случае у меня есть такой код:

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

И чтобы выполнить мои сценарии, у меня есть:

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

Я бы предпочел лучшее решение, но сейчас это все, что у меня есть.

Этот код также, кажется, работает, хотя я не уверен, действительно ли это хорошая идея. `MetaClass metaClass = new DelegatingMetaClass (Настройки)` `@ XmlTransient`` MetaClass getMetaClass () {`` metaClass` `}`

Похожие вопросы