REST和非RESTful URL一起工作并不起作用

时间:2014-12-27 20:06:32

标签: java json rest struts2 struts2-rest-plugin

我试图获得两者的实际示例,纯粹的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 =&gt;显示所有收据的列表

receipt/1.json =&gt;显示id = 1

的收据

但是,如果我尝试将restful与非宁静的网址混合在一起,(就像我在维基文章中所说的那样),就像这样:

<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映射?或者我在这里完全走错了方向?

2 个答案:

答案 0 :(得分:2)

基于前缀的动作映射器将查找映射委托给由

定义的相应映射器
<constant name="struts.mapper.prefixMapping" value="/rest:rest,:struts"/>

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

<强>参考文献:

答案 1 :(得分:1)

我也有同样的错误,我通过添加

来修复它
/buzzfeed/feed?limit=1

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