2011-06-04 162 views
2

我正在做一个jaxbcontext newInstance,将DO作为一个类传递。我的DO包含java.sql.clob作为其中一个领域。 这个clob字段在创建新实例时创建了一个问题。给错误的 出现异常而捕获CLOB如何克服“java.sql.Clob是一个接口,并且JAXB无法处理接口”问题

com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 3 counts of IllegalAnnotationExceptions 
java.sql.Clob is an interface, and JAXB can't handle interfaces. 
    this problem is related to the following location: 
     at java.sql.Clob 
     at public java.sql.Clob com.data.subscriber.SubscriberProvTransDO.getXmlString() 
     at com.data.subscriber.SubscriberProvTransDO 
The type of the getter is java.io.InputStream but that of the setter is long. They have to be the same. 
    this problem is related to the following location: 
     at public abstract java.io.InputStream java.sql.Clob.getAsciiStream() throws java.sql.SQLException 
     at java.sql.Clob 
     at public java.sql.Clob com.data.subscriber.SubscriberProvTransDO.getXmlString() 
     at com.data.subscriber.SubscriberProvTransDO 
    this problem is related to the following location: 
     at public abstract java.io.OutputStream java.sql.Clob.setAsciiStream(long) throws java.sql.SQLException 
     at java.sql.Clob 
     at public java.sql.Clob com.data.subscriber.SubscriberProvTransDO.getXmlString() 
     at com.data.subscriber.SubscriberProvTransDO 
The type of the getter is java.io.Reader but that of the setter is long. They have to be the same. 
    this problem is related to the following location: 
     at public abstract java.io.Reader java.sql.Clob.getCharacterStream() throws java.sql.SQLException 
     at java.sql.Clob 
     at public java.sql.Clob com.data.subscriber.SubscriberProvTransDO.getXmlString() 
     at com.data.subscriber.SubscriberProvTransDO 
    this problem is related to the following location: 
     at public abstract java.io.Writer java.sql.Clob.setCharacterStream(long) throws java.sql.SQLException 
     at java.sql.Clob 
     at public java.sql.Clob com.data.subscriber.SubscriberProvTransDO.getXmlString() 
     at com.data.subscriber.SubscriberProvTransDO 

    at com.sun.xml.bind.v2.runtime.IllegalAnnotationsException$Builder.check(IllegalAnnotationsException.java:66) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.getTypeInfoSet(JAXBContextImpl.java:389) 
    at com.sun.xml.bind.v2.runtime.JAXBContextImpl.<init>(JAXBContextImpl.java:236) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:76) 
    at com.sun.xml.bind.v2.ContextFactory.createContext(ContextFactory.java:55) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:79) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:618) 
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:210) 
    at javax.xml.bind.ContextFinder.find(ContextFinder.java:368) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:574) 
    at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:522) 
    at com.business.system.handler.EventProcessorHandler.insertFailure(EventProcessorHandler.java:286) 
    at com.business.system.handler.EventProcessorHandler.processRequest(EventProcessorHandler.java:184) 
    at com.business.system.EventProcessorBean.onMessage(EventProcessorBean.java:51) 
    at com.ibm.ejs.container.MessageEndpointHandler.invokeMdbMethod(MessageEndpointHandler.java:1086) 
    at com.ibm.ejs.container.MessageEndpointHandler.invoke(MessageEndpointHandler.java:773) 
    at $Proxy6.onMessage(Unknown Source) 
    at com.ibm.ws.sib.api.jmsra.impl.JmsJcaEndpointInvokerImpl.invokeEndpoint(JmsJcaEndpointInvokerImpl.java:201) 
    at com.ibm.ws.sib.ra.inbound.impl.SibRaDispatcher.dispatch(SibRaDispatcher.java:768) 
    at com.ibm.ws.sib.ra.inbound.impl.SibRaSingleProcessListener$SibRaWork.run(SibRaSingleProcessListener.java:584) 
    at com.ibm.ejs.j2c.work.WorkProxy.run(WorkProxy.java:419) 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1469) 

回答

3

你可以使用一个XmlAdapter这个用例。 XML适配器将不可映射对象java.sql.Clob转换为可映射对象,如String

ClobAdapter

import java.sql.Clob; 

import javax.xml.bind.annotation.adapters.XmlAdapter; 

public class ClobAdapter extends XmlAdapter<String, Clob> { 

    @Override 
    public Clob unmarshal(String v) throws Exception { 
     // Convert String to Clob 
    } 

    @Override 
    public String marshal(Clob v) throws Exception { 
     // Convert Clob to String 
    } 

} 

@XmlJavaTypeAdapter必须Clob中的属性进行设置。这个注释是您在XmlAdapter如何链接:

import java.sql.Clob; 

import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; 

public class Root { 

    private Clob clob; 

    @XmlJavaTypeAdapter(ClobAdapter.class) 
    public Clob getClob() { 
     return clob; 
    } 

    public void setClob(Clob clob) { 
     this.clob = clob; 
    } 

} 

演示

import javax.xml.bind.JAXBContext; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 
    } 
} 

更多信息

+0

谢谢布莱斯,我之前尝试过,但没有帮助我,并给出了上述同样的错误。 – ABC 2011-06-07 07:03:38

+0

@ABC - 你可以在我的答案中尝试简短的演示,并让我知道,如果你看到一个异常? – 2011-06-07 14:24:40

+0

嘿,Demo确实对我有用。现在困惑为什么它不适合我的项目 – ABC 2011-06-08 06:13:04