我在超级类上使用xjc: overClass和@javax.xml.bind.annotation.Xml瞬态注释。
我试图切换到Moxy,我得到这个错误:
'Exception Description: Property [aspectStyleBlock] in class [com.aplia.q4.document.ValueStyle] references a class [com.aplia.q4.domain.AbstractBlock] that is marked transient, which is not allowed.
- with linked exception:
[Exception [EclipseLink-50057] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.JAXBException
' .
这一切在JAXB2.1下都可以正常工作
如果删除超类上的XmlTransient注释,则会出现以下错误:
'ava.lang.RuntimeException: javax.xml.bind.JAXBException
- with linked exception:
[java.lang.NullPointerException]
....
'Caused by: javax.xml.bind.JAXBException
- with linked exception:
[java.lang.NullPointerException]
at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:825)
at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:136)
at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:142)
at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:129)
at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:93)
at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:83)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:331)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
at com.aplia.q4.service.hosting.impl.JAXBAdapter.<init>(JAXBAdapter.java:35)
... 27 more
Caused by: java.lang.NullPointerException
at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateChoiceCollectionMapping(MappingsGenerator.java:686)
at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateMapping(MappingsGenerator.java:434)
at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateMappings(MappingsGenerator.java:1996)
at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateMappings(MappingsGenerator.java:1957)
at org.eclipse.persistence.jaxb.compiler.MappingsGenerator.generateProject(MappingsGenerator.java:193)
at org.eclipse.persistence.jaxb.compiler.Generator.generateProject(Generator.java:174)
at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:830)
at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:823)
... 41 more'
我有大约100个从模式生成的类(我不控制模式)。我试图使用http://jaxb2-commons.dev.java.net/basic/inheritance来实现一个接口,而不是xjc:超类,但是它需要我列出我所有的100个类,因为绑定xpath不能在多个节点上匹配。除非这是解决问题的唯一方法,否则不愿意这样做。
这阻碍了我转换为Moxy impl的努力。
有关我的设置的详细信息
从…起https://sites.google.com/site/codingkb/java-2/jaxb/jaxb-4
“因为@XmlValue不允许在派生另一个类的类上使用。您希望自动生成的JAXB类扩展公共父类……所以您可以在XSD中添加如下内容:
不幸的是,当您编译时,您会收到一条错误消息:线程“main”中的异常com.sun.xml.bind.v2.runtime.IllegalAnnotationsExcture:在派生另一个类的类上不允许1次IllegalAnnotationExceptions@XmlValue计数。
解决方案是向基类添加注释:@javax。xml。绑定注释。XmlTransient公共类JAXBSuperClass{…}"
我的pom文件(仅限相关部分):
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.1.13</version>
<scope>runtime</scope>
</dependency>
<plugin>
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<version>0.7.4</version>
<executions>
<execution>
<id>generate-q4-document-jaxb</id>
<phase>generate-sources</phase>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<extension>true</extension>
<args>
<arg>-Xboolean-getter</arg>
<arg>-Xinheritance</arg>
</args>
<plugins>
<plugin>
<groupId>org.jvnet.jaxb2_commons</groupId>
<artifactId>jaxb2-basics</artifactId>
<version>0.5.3</version>
</plugin>
<plugin>
<groupId>com.nebulent.xjc</groupId>
<artifactId>boolean-getter</artifactId>
<version>1.0</version>
</plugin>
</plugins>
<schemaDirectory>${project.build.directory}/generated-sources/schema</schemaDirectory>
<bindingDirectory>${basedir}/src/main/resources/jaxb-bindings</bindingDirectory>
<forceRegenerate>true</forceRegenerate>
</configuration>
</execution>
</executions>
</plugin>
让我知道,如果你需要一个模式,或任何其他信息。
提前谢谢!
注意:我是EclipseLink JAXB(MOXy)的负责人,也是JAXB(JSR-222)专家组的成员。
与您的问题相关的有几个问题:
问题#1-莫西例外
你能提供一个小样本来说明你所看到的问题吗?
更新1:我相信您看到的问题与以下EclipseLink bug有关:
更新2:我们已经修复了EclipseLink 2.3中的错误。3(可于5月10日下载)和2.4。0(可于5月11日下载)流。您可以从以下位置下载这些文件:
问题#2-@子类上的XmlValue
JAXB RI无法处理此用例:
Exception in thread "main" com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
@XmlValue is not allowed on a class that derives another class.
this problem is related to the following location:
at public java.lang.String forum10437666.Child.getValue()
at forum10437666.Child
at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:102)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:472)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:302)
at com.sun.xml.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1140)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:154)
at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:121)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:202)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:363)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522)
at forum10437666.ValueDemo.main(ValueDemo.java:11)
只要父类不将其任何字段/属性映射到XML元素,EclipseLink JAXB(MOXy)就可以:
家长
父类只包含到XML属性的映射。
package forum10437666;
import javax.xml.bind.annotation.XmlAttribute;
public class Parent {
private int id;
@XmlAttribute
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
小孩
Child
扩展了Parent
,并有一个映射了@XmlValue
的属性。
package forum10437666;
import javax.xml.bind.annotation.XmlValue;
public class Child extends Parent {
private String value;
@XmlValue
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
ValueDemo
package forum10437666;
import javax.xml.bind.*;
import javax.xml.namespace.QName;
public class ValueDemo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Child.class);
Child child = new Child();
child.setId(123);
child.setValue("ABC");
JAXBElement<Child> je = new JAXBElement<Child>(new QName("child"), Child.class, child);
Marshaller marshaller = jc.createMarshaller();
marshaller.marshal(je, System.out);
}
}
输出
<?xml version="1.0" encoding="UTF-8"?>
<child xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="123">ABC</child>
问题内容: 我正在使用Java 6注释处理API。我遵循了以下出色的教程,以创建用于在构建时显示消息的注释处理器: http://kerebus.com/2011/02/using-java-6-processors-in- eclipse/ 但是,就我而言,我有一个简单的类: 如您所见,使用元注释“ Retention”在运行时使JVM可以使用上述注释。我在另一个类的源代码中使用此“标准”注释来
下面是我的代码, 我无法用注释来注释类, Netbean IDE说注释类型不适用于这种声明。 我用netbeans运行JDK 1.6和Jaxb 1.5。 感谢您的任何帮助。
这过去适用于所有以前版本的JAXB。我已经升级到JAXB的2.2.7版本,现在抛出以下内容: java.lang.AssertionError:javax.xml.bind.jaxBException-带有链接异常:[com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1 counts of IllegalAnnotat
我有一个带有云endpoint的AppEngine(Java)项目。它通过以下方式获得Groovy支持: 除了在过程中给出以下错误外,其他一切似乎都正常工作: 如果这是真的,那么就可以排除@API类中的方法作为@APIMethod公开?
自定义注释 自定义注释处理程序 超级类 子类 Subclass调用SuperClass方法但在不调用 当我将移动到子类method时,AspectHandler可以获取 如何在超类保护方法中使用自定义注释? 更改 但还是不行 所以我把我的< code >子DAO改成了under code 这不是完美的解决方案,但它的工作原理 情况1:从子类方法调用超类方法不起作用 情况 2:使超级类实例和从实例调