In short, it was a uppercase-lowercase typo in a String, Robin helped me find it by asking for details in a comment, and the code above works. Thanks Robin!
Smack XMPP Custom Extensions not arriving fully
题
I've got Smack running with OpenFire. Message Transfer works fine, but custom extensions never arrive fully.
This is what get's sent (by a not-smack library):
<message type="normal" id="42444f16-761f-471d-a37c-c9204cf14cfc" to="timmy@openfireserver.eu">
<operation xmlns="http://www.openfireserver.eu/ns/xmpp-rest" ack="false">PUT</operation>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="simple" content-disposition="riddl-data; name="value"">stopped</part>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="simple" content-disposition="riddl-data; name="tims"">world</part>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="complex" content-disposition="riddl-data; name="excellent"" content-transfer-encoding="binary" content-type="text/plain">party time</part>
</message>
This is what arrives:
<message id="42444f16-761f-471d-a37c-c9204cf14cfc" to="timmy@openfireserver.eu" from="jürgen@openfireserver.eu/f8c64ccb">
<operation xmlns="http://www.openfireserver.eu/ns/xmpp-rest"></operation>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest"></part>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest"></part>
<part xmlns="http://www.openfireserver.eu/ns/xmpp-rest"></part>
</message>
I tried creating an OperationExtension and setting it before the connection is created like this:
OperationProvider o = new OperationProvider();
ProviderManager.getInstance().addExtensionProvider(o.getExtension().getElementName(),o.getExtension().getNamespace(), o);
The OperationProvider looks like this for testing, but my breakpoints never get hit :-(
public class OperationProvider implements PacketExtensionProvider {
private OperationExtension extension = new OperationExtension();
@Override
public PacketExtension parseExtension(XmlPullParser xmlparser) throws Exception {
OperationExtension o = new OperationExtension();
System.out.println("YAAAA + " + xmlparser.getText());
String text = xmlparser.nextText();
while (text != null)
{
System.out.println("YAAAA + " + text);
text = xmlparser.nextText();
}
return o;
}
public OperationExtension getExtension() {
return extension;
}
public void setExtension(OperationExtension extension) {
this.extension = extension;
}
}
The OperationExtension itself is pretty basic (set breakpoints here to hopefully have them hit sometimes, but doesn't work):
public class OperationExtension implements PacketExtension {
public static final String NAMESPACE = "http://www.openfireserver.eu/ns/xmpp-rest";
public String getElementName()
{
return "Operation"; // <-- here was my error, it should say (lower-case) "operation"
}
public String getNamespace()
{
return NAMESPACE;
}
@Override
public String toXML() {
return "<Operation>GET</Operation>"; // this is also just mockup with a breakpoint ;-)
}
}
, but the toXml() method also doesn't get called. As some of the few available docs suggest, I put a smack.properties file in a META-INF folder inside the /src path of the project, and I made it look like this:
<?xml version="1.0"?>
<extensionProvider>
<elementName>operation</elementName>
<namespace>http://www.openfireserver.eu/ns/xmpp-rest</namespace>
<className>adventure.messagerouting.XmppExtensions.OperationExtension</className>
</extensionProvider>
<extensionProvider>
<elementName>part</elementName>
<namespace>http://www.openfireserver.eu/ns/xmpp-rest</namespace>
<className>adventure.messagerouting.XmppExtensions.PartExtension</className>
</extensionProvider>
I can that my Provider is registered in ProviderManager.getInstance().getExtensionProviders();
but I cannot say why it's code is never called.
- Do I do something wrong here? Why do my attributes and tag contents not arrive in smack?
- Is it possible that OpenFire filters something out?
解决方案 2
其他提示
I think you could also use PacketExtension to extend your custom message packet.
Message message = new Message();
DefaultPacketExtension yourExt = new DefaultPacketExtension("your_ext", "com:your:ext:namespace");
yourExt.setValue("<XML element name>", <XML element value>);
messgae.addExtension(yourExt);