我正在创建一个jaxbcontext newInstance,将DO作为一个类传递。我将DO包含java.sql.clob作为其中一个字段。 此clob字段在创建新实例时会产生问题。给出错误 捕获clob时发生异常
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)
答案 0 :(得分: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
}
}
<强>根强>
必须在Clob属性上设置@XmlJavaTypeAdapter
。此注释是您在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);
}
}
了解更多信息