2016-02-18 1 views
0

Я использую converse.js и пытаюсь работать с списками конфиденциальности. Я пытаюсь отправить этот IQ:Openfire возвращает ошибку 500 при получении списков конфиденциальности

<body rid="2993056535" xmlns="http://jabber.org/protocol/httpbind" sid="578oe88nm1"> 
    <iq from="[email protected]" type="set" id="active1" xmlns="jabber:client"> 
     <query xmlns="jabber:iq:privacy"/> 
    </iq> 
</body> 

Это то, что сервер возвращает меня:

<body xmlns="http://jabber.org/protocol/httpbind" ack="2993056535"> 
    <iq xmlns="jabber:client" type="error" id="active1" to="[email protected]/converse.js-90734653"> 
     <query xmlns="jabber:iq:privacy"/> 
     <error code="500" type="wait"> 
      <internal-server-error xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/> 
     </error> 
    </iq> 
</body> 

В логах сервера я вижу это исключение:

2016.02.19 12:49:00 org.jivesoftware.openfire.handler.IQHandler - Internal server error 
java.lang.NullPointerException 
     at org.jivesoftware.openfire.handler.IQPrivacyHandler.handleIQ(IQPrivacyHandler.java:120) 
     at org.jivesoftware.openfire.handler.IQHandler.process(IQHandler.java:66) 
     at org.jivesoftware.openfire.IQRouter.handle(IQRouter.java:372) 
     at org.jivesoftware.openfire.IQRouter.route(IQRouter.java:115) 
     at org.jivesoftware.openfire.spi.PacketRouterImpl.route(PacketRouterImpl.java:78) 
     at org.jivesoftware.openfire.SessionPacketRouter.route(SessionPacketRouter.java:108) 
     at org.jivesoftware.openfire.SessionPacketRouter.route(SessionPacketRouter.java:67) 
     at org.jivesoftware.openfire.http.HttpSession.sendPendingPackets(HttpSession.java:639) 
     at org.jivesoftware.openfire.http.HttpSession$HttpPacketSender.run(HttpSession.java:1270) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:745) 

Что случилось?

+0

Есть ли что-либо в журналах сервера Openfire? – legoscia

+0

http://pastebin.com/UG9yJnHA –

ответ

1

StackTrace points to these lines:

// Privacy list handling (create/edit/delete) 
Element list = child.element("list"); 
String listName = list.attributeValue("name"); 

То есть, он ищет дочерний элемент <list>, и падает, когда он не может найти его.

Так зачем же это искать? Оказывается, что это ветвь, которая требуется, если IQ имеет тип set (и ни один из <default> или <active> дочерний элемент). Однако, как описано в XEP-0016, для получения имен существующих списков конфиденциальности вам нужно отправить IQ с типом get. Ваш запрос должен выглядеть следующим образом:

<iq from='[email protected]/orchard' type='get' id='getlist1'> 
<query xmlns='jabber:iq:privacy'/> 
</iq>