我所有尝试获得两者的工作示例,纯restful配置以及至少一个非restful URL都失败了。
我有这个页面作为指南: https ://cwiki.apache.org/confluence/display/WW/REST+Plugin
我有一个模型,Receipt
有几个测试字段。
纯 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"/>
适用于这些结果:
receipt.json
=> 显示所有收据的列表
receipt/1.json
=> 显示 id = 1 的收据
但是,如果我尝试将 restful 与 non-restful 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
将映射到我的纯 restful 控制器,该控制器又将映射到我的收据,而没有/rest
前缀的任何内容都将映射到默认的 struts 映射?还是我在这里完全走错了方向?