REST 和非 RESTful URL 的"在一起"不起作用



我所有尝试获取两者的工作示例,纯 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 与非 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 映射? 还是我在这里完全走错了方向?

基于前缀的操作映射器委托查找映射到

<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>

这意味着在最后一个斜杠/之前在 URL 中/rest的所有 URL 都将映射到其余映射器,其他 URL 将映射到默认映射器。如果您有 receipt 控制器,则应使用值 "/receipt:rest,:struts"

引用:

  • REST 插件
  • RestfulActionMapper
  • 前缀基于操作映射器

我也有同样的错误,我通过添加来修复它

<package name="api" namespace="/api" extends="rest-default">
    <action name="users/*" class="com.aurum.struts.rest.UserController">
        <param name="id">{1}</param>
    </action>
</package>

REST 和非 REST 操作的完整示例在这里 https://github.com/sivailango/struts2-rest-nonrest