Java 如何在编组/解编组期间忽略基类?
我有一个类扩展了Java 如何在编组/解编组期间忽略基类?,java,jaxb,Java,Jaxb,我有一个类扩展了线程,我希望能够将其配置信息存储为xml。由于所有其他属性以及Thread类中没有的属性,这显然不起作用。在编组过程中,我得到了一个很好的堆栈跟踪: Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions java.lang.Thread$UncaughtException
线程
,我希望能够将其配置信息存储为xml。由于所有其他属性以及Thread
类中没有的属性,这显然不起作用。在编组过程中,我得到了一个很好的堆栈跟踪:
Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 2 counts of IllegalAnnotationExceptions
java.lang.Thread$UncaughtExceptionHandler is an interface, and JAXB can't handle interfaces.
this problem is related to the following location:
at java.lang.Thread$UncaughtExceptionHandler
at public java.lang.Thread$UncaughtExceptionHandler java.lang.Thread.getUncaughtExceptionHandler()
at java.lang.Thread
at Test
java.lang.Thread$UncaughtExceptionHandler does not have a no-arg default constructor.
this problem is related to the following location:
at java.lang.Thread$UncaughtExceptionHandler
at public java.lang.Thread$UncaughtExceptionHandler java.lang.Thread.getUncaughtExceptionHandler()
at java.lang.Thread
at Test
at com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:91)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:451)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:283)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:126)
at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl$JAXBContextBuilder.build(JAXBContextImpl.java:1142)
at com.sun.xml.internal.bind.v2.ContextFactory.createContext(ContextFactory.java:130)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:248)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:235)
at javax.xml.bind.ContextFinder.find(ContextFinder.java:445)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:637)
at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:584)
at Test.main(Test.java:22)
本质上,我只关心Test
类中的内容,而不关心继承的内容。比如:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<test something="My Value"/>
那么,在编组/解编组过程中,如何忽略基类呢?为什么要扩展线程而不实现Runnable 无论如何,我认为您的解决方案不是对线程或任何扩展它的类进行封送和解封,而是创建一个单独的配置类,该类保存您将封送和解封的重要状态数据 e、 g 这将产生预期的输出:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testConfig something="My Value"/>
我认为另一种可能的解决方案是尝试使用一种适配器类型,如XmlAdapter,也许最好的解决方案是使用。谢谢,你是对的,我可能应该实现Runnable,而不是从一开始就扩展线程。这就解决了我的问题,而不需要做太多更改,也不需要添加另一个类(我一直试图避免)。@jschoen:很乐意提供帮助,但请关注这条线索,看看Blaise Doughan是否会回复,因为他可能会给你一个你需要的最佳规范答案。
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
public class Test implements Runnable {
private TestConfig config = new TestConfig();
public Test() {
}
public void setConfigSomething(String something) {
config.setSomething(something);
}
public TestConfig getConfig() {
return config;
}
public void setConfig(TestConfig config) {
this.config = config;
}
@Override
public void run() {
// foo
}
public static void main(String[] args) throws JAXBException {
Test test = new Test();
test.setConfigSomething("My Value");
JAXBContext jaxbContext = JAXBContext.newInstance(TestConfig.class);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(test.getConfig(), System.out);
}
}
@XmlRootElement
class TestConfig {
private String something;
@XmlAttribute
public String getSomething() {
return something;
}
public void setSomething(String something) {
this.something = something;
}
}
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<testConfig something="My Value"/>