我所有试图获得这两个纯静态配置以及至少一个非静态URL的有效示例的所有尝试均失败了.
我有此页面作为指南:
https://cwiki.apache.org/confluence/display/WW/REST+Plugin
我有一个模型,带有几个测试字段的收据.
纯REST解决方案可以按预期工作,因此请执行以下操作:
<constant name="struts.enable.DynamicMethodInvocation" value="false"/>
<constant name="struts.devMode" value="true"/>
<constant name="struts.mapper.class" value="rest" />
<constant name="struts.convention.action.suffix" value="Controller"/>
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<constant name="struts.convention.default.parent.package" value="rest-default"/>
<constant name="struts.convention.package.locators" value="controllers"/>
这些结果效果很好:
receive.json =>显示所有收据清单
receive / 1.json =>显示ID为1的收据
但是,如果我尝试将静态URL与非静态URL混合使用(就像在Wiki文章中告诉我的那样):
<constant name="struts.action.extension" value="xhtml,,xml,json,action"/>
<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.PrefixBasedActionMapper" />
<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>
<constant name="struts.convention.action.suffix" value="Controller"/>
<constant name="struts.convention.action.mapAllMatches" value="true"/>
<constant name="struts.convention.default.parent.package" value="rest-default"/>
<constant name="struts.convention.package.locators" value="controllers"/>
它炸毁了这个:
Struts has detected an unhandled exception:
Messages:
com.immaculate.receipto.controllers.ReceiptController.execute()
File: java/lang/Class.java
Line number: 1,778
我很困惑.为什么要搜索execute()?
execute()应该是存在于动作上的方法.我没有给它一个动作,而是给了它一个像以前一样的控制器.
我该如何解决?
这是ReceiptController:
public class ReceiptController implements ModelDriven<Object> {
private ReceiptManager receiptManager = new ReceiptManager();
private String id;
private Receipt model = new Receipt();
private Collection list;
public Object getModel(){
if(list==null){
return model;
} else {
return list;
}
}
public HttpHeaders create() {
receiptManager.save(model);
return new DefaultHttpHeaders("show");
}
public HttpHeaders show() {
model = receiptManager.find(id);
return new DefaultHttpHeaders("show");
}
public HttpHeaders destroy() {
model = receiptManager.destroy(id);
return new DefaultHttpHeaders("show");
}
public HttpHeaders index() {
list = receiptManager.list();
return new DefaultHttpHeaders("show");
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
显然我在这里做错了.除了这里说明的内容,我是否还需要了解其他内容?
另外,我该怎么读? :
<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>
这是否意味着以/ rest开头的所有内容都将映射到我的纯净宁静控制器,进而将其映射到我的收据,而没有/ rest前缀的所有内容都将映射到默认的struts映射?还是我在这里完全走错了方向?
解决方法:
基于前缀的动作映射器将查找映射委托给由定义的对应映射器
<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>
这意味着所有在最后一个斜杠之前的/ rest中的URL都将映射到其余映射器,其他映射到默认映射器.如果您有一个收据控制器,则应使用值“ / receipt:rest,:struts”.
参考文献:
> REST Plugin
> RestfulActionMapper
> PrefixBasedActionMapper