3

少なくとも 1 つの非安静な URL と一緒に純粋な安静な構成の両方の動作例を取得しようとする私の試みはすべて失敗しました。

このページをガイドとして持っています: https://cwiki.apache.org/confluence/display/WW/REST+Plugin

Receiptいくつかのテスト フィールドを持つ 1 つのモデルがあります。

純粋な 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 のレシートを表示

しかし、安らかな 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 マッピングにマップされることを意味しますか? それとも、ここで完全に間違った方向に進んでいますか?

4

2 に答える 2

2

接頭辞ベースのアクション マッパーは、検索マッピングを、によって定義された対応するマッパーに委任します。

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

/restこれは、URL 内の最後のスラッシュの前にあるすべての URL が/残りのマッパーにマップされ、それ以外はデフォルトのマッパーにマップされることを意味します。receiptコントローラーがある場合は、値を使用する必要があります"/receipt:rest,:struts"

参考文献:

于 2014-12-27T20:43:29.873 に答える
2

私も同じエラーが発生しました。追加して修正します

<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

于 2015-11-23T07:58:53.290 に答える