一下内容为引用“
今天本打算做一些基于XML的WebService接口,不料遇到了bug,折腾了一个下午带半个晚上,最后才在网上搜到原因和解决办法,特来分享。
原本正常情况下,Struts2是支持将一个Action中的全部属性以XML形式输出的,这就是XSLTResult。在struts.xml中这样配置
<action name="getuser"
class="org.lilystudio.winter.actions.service.GetUserAction">
<result name="success" type="xslt">
</result>
</action>
即可。
而为了输出Action中的某一个属性,需要增加一个param
<action name="getuser"
class="org.lilystudio.winter.actions.service.GetUserAction">
<result name="success" type="xslt">
<param name="exposedValue">user</param>
</result>
</action>
这里就是将user属性序列化成XML。属性的选择支持OGNL,也就是说,这里不仅可以填属性名,还可以填属性的属性,属性的集合等等,如
<param name="exposedValue">user.nickname</param>
<param name="exposedValue">{ user1,user2 }</param>
这里用的都是一个默认的XSL
<xsl:template match="/result">
<result />
</xsl:template>
也可以通过用户指定的方式使用自定义的复杂的XSL
<param name="location">/WEB-INF/foo.xsl</param>
不过,据这篇文章的留言说在Struts2.0.11所使用的SimpleAdaptedDocument不支持DOM Level 3,与JDK中的Transformor冲突。于是会抛出这样的异常
javax.xml.transform.TransformerException: Operation not supported.
怎么办呢?同一篇文章给出了答案,使用一个自定义的XSL
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml"/>
<xsl:template match="/">
<xsl:copy-of select="."/>
</xsl:template>
</xsl:stylesheet>
作者说这种方法不太pretty,不过在Struts2修改这个问题之前恐怕这是一个不错的办法了。最后我也是看到这个才免于一晚上的徒劳。
可惜我对XML、XSLT之类的知识还是欠缺不少,白白浪费了时间,很是无奈。
”
后来我稳到个更简单噶办法,就是将JDK改会JDK1.5就OK了,我试过在JDK1.6中会出现问题。在1.5中暂时还没发现类似问题