【问题标题】:Smack XMPP Custom Extensions not arriving fullySmack XMPP 自定义扩展未完全到达
【发布时间】:2013-08-02 01:13:23
【问题描述】:

我已经让 Smack 与 OpenFire 一起运行。消息传输工作正常,但自定义扩展无法完全到达。

这是 get 发送的内容(由非 smack 库发送):

<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=&quot;value&quot;">stopped</part>
  <part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="simple" content-disposition="riddl-data; name=&quot;tims&quot;">world</part>
  <part xmlns="http://www.openfireserver.eu/ns/xmpp-rest" RIDDL-TYPE="complex" content-disposition="riddl-data; name=&quot;excellent&quot;" content-transfer-encoding="binary" content-type="text/plain">party time</part>
</message>

这是到达的:

<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>

我尝试创建一个 OperationExtension 并在创建连接之前对其进行设置,如下所示:

OperationProvider o = new OperationProvider();
ProviderManager.getInstance().addExtensionProvider(o.getExtension().getElementName(),o.getExtension().getNamespace(), o);

OperationProvider 看起来像这样用于测试,但我的断点永远不会被命中 :-(

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;
    }

}

OperationExtension 本身非常基本(在此处设置断点以希望它们有时会被命中,但不起作用):

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 ;-)
    }

}

,但 toXml() 方法也不会被调用。正如一些可用的文档所建议的那样,我将一个 smack.properties 文件放在项目的 /src 路径内的 META-INF 文件夹中,我使它看起来像这样:

<?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>

我可以说我的 Provider 已在 ProviderManager.getInstance().getExtensionProviders(); 中注册,但我不能说为什么它的代码从未被调用过。

  1. 我在这里做错了吗?为什么我的属性和标签内容没有到达?
  2. OpenFire 有可能过滤掉一些东西吗?

【问题讨论】:

  • 您不需要属性文件,因为您直接调用 addExtensionProvider()。您的配置看起来正确,但我们并不真正知道元素名称和命名空间设置为什么。我怀疑它们是错误的,因为这是在解析过程中映射提供者的原因。
  • 好的,罗宾,你的评论是正确的。在问题中发布 OperationExtension 类以向您展示我已经正确理解了所有内容时,我看到该类返回的标记名是大写而不是小写。改变了这一点,一切正常。如果您将此作为答案,我会立即接受。谢谢!

标签: java xmpp openfire smack


【解决方案1】:

我认为您也可以使用PacketExtension 来扩展您的自定义消息包。

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);

【讨论】:

  • 不,默认数据包扩展缺少我需要的重要内容,我认为是属性。
【解决方案2】:

简而言之,这是一个字符串中的大写小写拼写错误,Robin 通过在评论中询问详细信息帮助我找到了它,并且上面的代码有效。谢谢罗宾!

【讨论】:

  • ...所以我在上面的问题中所做的工作完全有效,我在 OperationExtension 源的评论中指出了小写字符串问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-13
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多