一、源码:

package com.souvc.weixin.util;

import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.souvc.weixin.message.resp.Article;
import com.souvc.weixin.message.resp.ImageMessage;
import com.souvc.weixin.message.resp.MusicMessage;
import com.souvc.weixin.message.resp.NewsMessage;
import com.souvc.weixin.message.resp.TextMessage;
import com.souvc.weixin.message.resp.VideoMessage;
import com.souvc.weixin.message.resp.VoiceMessage;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;

/**
* 类名: MessageUtil </br>
* 描述: 消息处理工具类</br>
* 开发人员: souvc </br>
* 创建时间: 2015-9-30 </br>
* 发布版本:V1.0 </br>
*/
public class MessageUtil {
// 请求消息类型:文本
public static final String REQ_MESSAGE_TYPE_TEXT = "text";
// 请求消息类型:图片
public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
// 请求消息类型:语音
public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
// 请求消息类型:视频
public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
// 请求消息类型:小视频
public static final String REQ_MESSAGE_TYPE_SHORTVIDEO = "shortvideo";
// 请求消息类型:地理位置
public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
// 请求消息类型:链接
public static final String REQ_MESSAGE_TYPE_LINK = "link";

// 请求消息类型:事件推送
public static final String REQ_MESSAGE_TYPE_EVENT = "event";

// 事件类型:subscribe(订阅)
public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
// 事件类型:unsubscribe(取消订阅)
public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
// 事件类型:scan(用户已关注时的扫描带参数二维码)
public static final String EVENT_TYPE_SCAN = "scan";
// 事件类型:LOCATION(上报地理位置)
public static final String EVENT_TYPE_LOCATION = "LOCATION";
// 事件类型:CLICK(自定义菜单)
public static final String EVENT_TYPE_CLICK = "CLICK";

// 响应消息类型:文本
public static final String RESP_MESSAGE_TYPE_TEXT = "text";
// 响应消息类型:图片
public static final String RESP_MESSAGE_TYPE_IMAGE = "image";
// 响应消息类型:语音
public static final String RESP_MESSAGE_TYPE_VOICE = "voice";
// 响应消息类型:视频
public static final String RESP_MESSAGE_TYPE_VIDEO = "video";
// 响应消息类型:音乐
public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
// 响应消息类型:图文
public static final String RESP_MESSAGE_TYPE_NEWS = "news";

/**
* 解析微信发来的请求(XML)
*
*
@param request
*
@return Map<String, String>
*
@throws Exception
*/
@SuppressWarnings(
"unchecked")
public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
// 将解析结果存储在HashMap中
Map<String, String> map = new HashMap<String, String>();

// 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document
= reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();

// 遍历所有子节点
for (Element e : elementList)
map.put(e.getName(), e.getText());

// 释放资源
inputStream.close();
inputStream
= null;

return map;
}

/**
* 扩展xstream使其支持CDATA
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true;

@SuppressWarnings(
"unchecked")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}

protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write(
"<![CDATA[");
writer.write(text);
writer.write(
"]]>");
}
else {
writer.write(text);
}
}
};
}
});

/**
* 文本消息对象转换成xml
*
*
@param textMessage 文本消息对象
*
@return xml
*/
public static String messageToXml(TextMessage textMessage) {
xstream.alias(
"xml", textMessage.getClass());
return xstream.toXML(textMessage);
}

/**
* 图片消息对象转换成xml
*
*
@param imageMessage 图片消息对象
*
@return xml
*/
public static String messageToXml(ImageMessage imageMessage) {
xstream.alias(
"xml", imageMessage.getClass());
return xstream.toXML(imageMessage);
}

/**
* 语音消息对象转换成xml
*
*
@param voiceMessage 语音消息对象
*
@return xml
*/
public static String messageToXml(VoiceMessage voiceMessage) {
xstream.alias(
"xml", voiceMessage.getClass());
return xstream.toXML(voiceMessage);
}

/**
* 视频消息对象转换成xml
*
*
@param videoMessage 视频消息对象
*
@return xml
*/
public static String messageToXml(VideoMessage videoMessage) {
xstream.alias(
"xml", videoMessage.getClass());
return xstream.toXML(videoMessage);
}

/**
* 音乐消息对象转换成xml
*
*
@param musicMessage 音乐消息对象
*
@return xml
*/
public static String messageToXml(MusicMessage musicMessage) {
xstream.alias(
"xml", musicMessage.getClass());
return xstream.toXML(musicMessage);
}

/**
* 图文消息对象转换成xml
*
*
@param newsMessage 图文消息对象
*
@return xml
*/
public static String messageToXml(NewsMessage newsMessage) {
xstream.alias(
"xml", newsMessage.getClass());
xstream.alias(
"item", new Article().getClass());
return xstream.toXML(newsMessage);
}
}
View Code

二、异常

这个异常是在做微信开发时出现的,在引入了XStream的jar包之后,还是出现了如下错误信息:

1.鼠标移到带红叉的黄灯上时,

Multiple markers at this line
- The type org.xmlpull.v1.XmlPullParser cannot be resolved. It is indirectly referenced from
required .
class files
- The type org.xmlpull.v1.XmlPullParser cannot be resolved. It is indirectly referenced from
required .
class files

2.当鼠标移到第一行时,

The type org.xmlpull.v1.XmlPullParser cannot be resolved. It is indirectly referenced from required .class files

三、原因

The type org.xmlpull.v1.XmlPullParser cannot be resolved.告诉我们,是因为xmlpull的问题。

原因在于,XStream只是一个jar文件,但是它里面会依赖一个jar包,依赖的jar包是:xmlpull_1_0_5.jar、只要把这个jar包引入之后,问题即可解决

更多相关文章

  1. 为什么我们应该将XMPP而不是JSON用于简单(仅文本)消息传递应用程序
  2. 封装底部dialog弹窗 adapter T类型的适配同种布局不同实体类
  3. Android[中级教程] 深入剖析Android消息机制
  4. Android 中文件类型与MIME的匹配表
  5. Android消息推送接收后,通知栏的显示
  6. 如何执行删除请求而不返回类型或回调?(改造)
  7. 如何将Java中的类型与反射进行比较
  8. “checkout as maven project from scm”中缺少scm类型
  9. Spring Hibernate:没有类型为org.hibernate.SessionFactory的匹配

随机推荐

  1. Android的几种通讯方式
  2. Android学习笔记--Binder
  3. Android View回顾之坐标系
  4. 从Android 1.0到Android 8.0,盘点每一代系
  5. 微软和Wistron再度联手,Android和Chrome O
  6. Android进阶(一)View体系
  7. (一)Android应用程序及组件简介
  8. 【Android实战开发】3G技术和Android发展
  9. AndroidManifest.xml 详解 (四) 之uses-p
  10. 阿里ctf-2014 android 第三题——so动态