我如何让Groovy和JAXB一起玩得漂亮

2022-09-02 03:17:48

我试图让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 {
    }

槽的:

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

答案 1

取消注释 1 和 4 是使用 Groovy 设置 JAXB 的正确方法。它不起作用的原因是每个Groovy类都有一个metaClass属性。JAXB 正试图将其公开为 JAXB 属性,但显然失败了。由于您不是自己声明 metaClass 属性,因此无法对它进行批注以使 JAXB 忽略它。相反,您将 XmlAccessType 设置为 NONE。此禁用 JAXB 的自动发现属性以公开为 XML 元素。执行此操作后,需要显式声明要公开的任何字段。

例:

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

答案 2

我在暴露Grails GORM对象时遇到了同样的问题。在研究了上面发布的解决方案后,使用,我很快就厌倦了将所有内容标记为.@XmlAccessorType( XmlAccessType.NONE )@XmlAttribute

我在使用以下内容方面取得了很大的成功:

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

请参见: XmlAccessType

感谢原来的答案让我朝着正确的方向开始。


推荐