2013-03-20 2 views
2

Thread을 확장하는 클래스가 있는데, XML로 구성 정보를 저장할 수 있기를 원합니다. 이것은 다른 모든 속성과 Thread 클래스에없는 것 때문에 분명히 작동하지 않습니다. 기본적으로마샬링/언 마샬링 중 기본 클래스를 무시하는 방법은 무엇입니까?

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; 



@XmlRootElement 
public class Test extends Thread{ 

    @XmlAttribute 
    public String something; 

    public Test(){ 
    } 

    public static void main(String[] args) throws JAXBException { 
     Test test = new Test(); 
     test.something = "My Value"; 

     JAXBContext jaxbContext = JAXBContext.newInstance(Test.class); 

     Marshaller jaxbMarshaller = jaxbContext.createMarshaller(); 
     // output pretty printed 
     jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     jaxbMarshaller.marshal(test, System.out); 

    } 

} 

난 그냥 Test 클래스에 상속되어 있지 어떤 것에 대해 걱정 : 여기

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) 

문제를 설명하는 간단한 클래스입니다 : 마샬링 동안 나는 좋은 스택 추적을 얻을 . 그래서 뭔가 같은 :
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<test something="My Value"/> 

그래서 어떻게/비 정렬 화를 정렬 화시의 기본 클래스를 무시합니까?

답변

3

왜 스레드를 확장하고 Runnable을 구현하지 않습니까?

에 관계없이, 귀하의 솔루션은 마샬링하고 스레드 또는 그것을 확장하는 모든 클래스를 마샬링하는 것이 아니라 마셜 및 언 마샬링 할 중요한 상태 데이터를 보유하는 별도의 구성 클래스를 만드는 것입니다. 예를 들어

,

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"/> 

나는 또 다른 가능한 솔루션은 이러한 (때문에) XmlAdapter 같은 어댑터 유형을 사용하려고하는 것입니다 가정 아마도 가장 좋은 해결책은 MOXy as per Blaise Doughan's suggestion을 사용하는 것입니다.

+0

고마워, 당신 말이 맞아, 아마 스레드를 확장하는 대신에 Runnable을 구현 했어야했다. 그렇게하면 많은 것을 변경하거나 다른 클래스 (필자가 피하려고했던 클래스)를 추가 할 필요없이 내 문제를 해결할 수 있습니다. –

+0

@ jschoen : 도움이 되서 기쁩니다.하지만 Blaise Doughan이 답장을 보내고 있는지 확인하기 위해이 스레드를 주시하십시오. 필요로하는 최상의 정식 답을 줄 것입니다. –

관련 문제