在使用struts时,由于继承了LookupDispatchAction,所以为其写了资源文件
出现了下面的异常:
missing resource 'received' in key method map javax.servlet.ServletException: Action[/messageAction] missing
resource 'received' in key method map
检查了类、资源文件、配置文件、路径,等等等等,都是对的,于是猜测各种情况,不断郁闷+重启后,异常依旧,已经过去了一个上午,心急如焚,于是决定,重新打包部署,把不用的配置删掉,采用排除法来确定异常所在,最后把目光锁定在struts-config.xml上,因为涉及到资源文件配置的就是这个文件了,在这个文件中,只留下对我有用的一组配置(Form+Action+Resource)后,打包、部署到Websphere中,嘿嘿,成功了!于是又恢复该配置文件到最初,留下一个资源文件配置(All Forms+AllActions+...+onlyResource-->“<message-resources parameter="com.ztesoft.ds.application.web.message.resource.Resources" />”),其余删掉,重启后成功,于是再把Resource全部恢复,再一个一个删掉,删掉一个,重启一次,(总之排列组合,幸亏配置不多......此处删去n字),最后,终于确定到以下两个资源文件上了
<message-resources parameter="com.ztesoft.ds.application.web.bulletin.resource.BulletinResource" />
<message-resources parameter="com.ztesoft.ds.application.web.discuss.resource.DiscussResource" />
我发现,将这两个资源文件删去,异常消除,加上任意一个,异常重现,我很纳闷,因为就算key有冲突,那也不可能在名字不一样的两个文件中冲突,而只可能在同一文件中冲突,就算可以在两个文件中冲突,那discuss.resource.DiscussResource文件中也没有和上述两文件冲突的key啊(我一行行看过了)。奇怪!
到了这一步,更让人为难了,为了使一个资源文件有用而删去另两个资源文件的配置,根本行不通啊,于是和MikeWang讨论,他提出将资源文件的位置换一换再看,结果message好了,却发现同样是继承LookupDispatch的discuss出现了问题,和刚才的异常完全一样,蒙了!看struts的源代码,知道了struts在对照键值对之前会先读入所有的资源文件
private Map initLookupMap(HttpServletRequest request, Locale userLocale) {
Map lookupMap = new HashMap();
this.keyMethodMap = this.getKeyMethodMap();
ModuleConfig moduleConfig =
(ModuleConfig) request.getAttribute(Globals.MODULE_KEY);
MessageResourcesConfig[] mrc = moduleConfig.findMessageResourcesConfigs();
// Look through all module's MessageResources
for (int i = 0; i < mrc.length; i++) {
MessageResources resources = this.getResources(request, mrc[i].getKey());
// Look for key in MessageResources
Iterator iter = this.keyMethodMap.keySet().iterator();
while (iter.hasNext()) {
String key = (String) iter.next();
String text = resources.getMessage(userLocale, key);
// Found key and haven't added to Map yet, so add the text
if ((text != null) && !lookupMap.containsKey(text)) {
lookupMap.put(text, key);
}
}
}
return lookupMap;
}
这个好象并不能解决这个问题,但是让我想到了另一个解决方案:将资源文件整合!以前是每个模块一个资源文件,现在将资源文件的内容全部放在一起。
接下来就是搜索,修改每个绑定资源的页面,struts-config.xml文件,完成后,重启服务,成功!看一下时间----16:21---靠,这一天光搞了个这~!
由此可知:继承LookupDispatch的Action服务,不能每个模块都去配置自己的资源文件,因为资源文件之间会有冲突,只能将资源放入一个文件,不知道是不是struts的bug,搞死了!
记之!