我有一种情况,通过Java程序,我创建一个javax.naming.ldap.LdapContext
并对其进行search()
操作 - 这是一个底层连接.然后我将Java应用程序线程置于休眠状态,在此期间我重新启动LDAP服务器(OpenLDAP,只需注意).当App线程唤醒并尝试对LdapContext
之前创建的任何操作进行操作时,它会抛出" CommunicationException: Connection is closed
".
我想要的是能够重新建立连接.
我看到LdapContext
有一个reconnect()
方法 - 我将控件传递给null
.但是,这没有任何效果.我在Sun LDAP实现中看到,在重新启动LDAP服务器期间,Sun实现维护的ConnectionPool com.sun.jndi.ldap.LdapClient
使用"useful = false" 标记了基础实例.在reconnect()
通话时 - 它只是呼叫ensureOpen()
,再次检查usable
标志是否false
- 如果是false
; 然后它抛出CommunicationException
- 所以回到原点.
我的问题是:Java应用程序如何在外部LDAP服务器重启后继续存在?是新的创造LdapContext
又是唯一出路?欣赏任何见解.
这是异常的堆栈跟踪:
javax.naming.CommunicationException: connection closed [Root exception is java.io.IOException: connection closed]; remaining name 'uid=foo,ou=People,dc=example,dc=com'
at com.sun.jndi.ldap.LdapCtx.doSearch(LdapCtx.java:1979)
at com.sun.jndi.ldap.LdapCtx.searchAux(LdapCtx.java:1824)
at com.sun.jndi.ldap.LdapCtx.c_search(LdapCtx.java:1749)
at com.sun.jndi.toolkit.ctx.ComponentDirContext.p_search(ComponentDirContext.java:368)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:338)
at com.sun.jndi.toolkit.ctx.PartialCompositeDirContext.search(PartialCompositeDirContext.java:321)
at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:248)
Caused by: java.io.IOException: …
Run Code Online (Sandbox Code Playgroud) 我遇到了JAXB Unmarshalling错误,如下所示.foo.bar.Base是一个抽象类,带有@XmlSeeAlso注释,其中列出了foo.bar.SubBase(这是foo.bar.Base的具体子类)
上述两个类都可以从main/entry类静态访问:com.example.Request
使用包字符串变量viz创建JAXBContext:
JAXBContext.newInstance("com.example",...);
Run Code Online (Sandbox Code Playgroud)
上面创建的JAXBContext正确列出了所有三个类: com.example.Request, foo.bar.Base and foo.bar.SubBase as "classes known to this JAXBContext"
但它在运行时在下面的解组调用中失败了.我无法弄清楚这里有什么问题.
unmarshaller.unmarshal(<some-DOM-Element-Instance>, com.example.Request.class);
Run Code Online (Sandbox Code Playgroud)
任何指针将不胜感激!谢谢!
堆栈跟踪是:
Caused by: javax.xml.bind.UnmarshalException: Unable to create an instance of foo.bar.Base - with linked exception: [java.lang.InstantiationException]
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642)
at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:254)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.createInstance(UnmarshallingContext.java:609)
at com.sun.xml.bind.v2.runtime.unmarshaller.StructureLoader.startElement(StructureLoader.java:181)
at com.sun.xml.bind.v2.runtime.unmarshaller.XsiTypeLoader.startElement(XsiTypeLoader.java:76)
at com.sun.xml.bind.v2.runtime.unmarshaller.ProxyLoader.startElement(ProxyLoader.java:55)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:481)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459)
at com.sun.xml.bind.v2.runtime.unmarshaller.InterningXmlVisitor.startElement(InterningXmlVisitor.java:71)
at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:148)
at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:239)
at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:276)
at com.sun.xml.bind.unmarshaller.DOMScanner.visit(DOMScanner.java:245)
at com.sun.xml.bind.unmarshaller.DOMScanner.scan(DOMScanner.java:122)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:314)
at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:293)
Caused by: java.lang.InstantiationException
at sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(InstantiationExceptionConstructorAccessorImpl.java:30)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at com.sun.xml.bind.v2.ClassFactory.create0(ClassFactory.java:123)
at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.createInstance(ClassBeanInfoImpl.java:261)
at …
Run Code Online (Sandbox Code Playgroud) JAXB将两者xsd:base64Binary
和xsd:hexBinary
类型映射到byte[]
.
鉴于我有一个架构/一个DOM元素代表这些类型中的每一个,例如:
<foo>ABCD</foo>
对于xsd:hexBinary和
<foo>YTM0NZomIzI2OTsmIzM0NTueYQ==</foo>
对于xsd:base64Binary,
目前尚不清楚JAXB 2.1如何处理它.
JAXB.unmarshal(new DOMSource(node), byte[].class)
不喜欢有效载荷.
以下都不是:
JAXBContext ctx = JAXBContext.newInstance(byte[].class);
ctx.createUnmarshaller().unmarshal(node);
处理这些类型的正确方法是什么?提前致谢.
我指的是这篇文章:使用jackson将json转换为object,最后一个答案是StaxMan,它表示在Jackson 1.7中可以设置配置,以便Jackson开始生成(也可能解析?)顶级标签/ JSON中的段.
有人可以阐明如何设置该配置,它只适用于JSON生成或解析吗?
非常感谢你!
我试图使用命令在我的OpenLDAP实例中从Oracle的JNDI教程导入以下示例:
ldapadd -x -D cn=admin,dc=example,dc=com -W -f refserver.ldif
Run Code Online (Sandbox Code Playgroud)
在哪里,refserver.ldif
看起来像这样:
dn: o=JNDITutorial,dc=example,dc=com
o: JNDITutorial
objectclass: top
objectclass: organization
dn: ou=All, o=JNDITutorial,dc=example,dc=com
ou: All
objectclass: top
objectclass: organizationalunit
dn: ou=People, o=JNDITutorial,dc=example,dc=com
ou: People
objectclass: top
objectclass: organizationalunit
objectclass: referral
ref: ldap://10.97.98.201:389/ou=People,o=JNDITutorial
dn: ou=People, ou=All, o=JNDITutorial,dc=example,dc=com
ou: People
objectclass: top
objectclass: organizationalunit
objectclass: referral
ref: ldap://10.97.98.201:389/ou=People,o=JNDITutorial
dn: ou=NewHires, ou=All, o=JNDITutorial,dc=example,dc=com
ou: NewHires
objectclass: top
objectclass: organizationalunit
objectclass: referral
ref: ldap://10.97.98.201:389/ou=NewHires,o=JNDITutorial
Run Code Online (Sandbox Code Playgroud)
这取得了部分成功,报告了以下内容:
adding new entry "o=JNDITutorial,dc=example,dc=com"
adding new entry "ou=All, …
Run Code Online (Sandbox Code Playgroud)