Подтвердить что ты не робот

Как мне получить Groovy и JAXB, чтобы играть вместе

Я пытаюсь заставить JAXB работать с классом groovy, но, похоже, он не работает, но версия 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.

Любые идеи?

Java:

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

Ответ 1

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

Пример:

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

Ответ 2

У меня была такая же проблема, когда вы открывали объект GILGIL GORM. Изучив решение, опубликованное выше, используя @XmlAccessorType( XmlAccessType.NONE ), я быстро устал отмечать все как @XmlAttribute.

У меня много успеха, используя:

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

Смотрите: XmlAccessType

Благодаря оригинальному ответу, чтобы начать меня в правильном направлении.

Ответ 3

Решение, похоже, не работает в абстрактном подклассе. Я думаю, это потому, что компилятор не генерирует код переопределения 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')

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