4

これを参考にして、Struts2 で REST のみの構成を作成しています。

https://cwiki.apache.org/confluence/display/WW/REST+Plugin

私は1つのモデル、タイトル、本文のいくつかのテストフィールドを持つ領収書を持っています。

現在、領収書を作成するために、次の方法でリクエストを送信します。

POST /receipt/?body=new_body&title=new_title

新しい本文とタイトルが渡された領収書が作成されます。

これは機能しません:

POST /receipt/
{
  "body": "new_body",
  "title": "new title"
}

ここにいくつかのコードがあります:

struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>

    <bean type="org.apache.struts2.rest.handler.ContentTypeHandler" name="jackson" class="org.apache.struts2.rest.handler.JacksonLibHandler"/>
    <constant name="struts.rest.handlerOverride.json" value="jackson"/>

    <constant name="struts.enable.DynamicMethodInvocation" value="false"/>
    <constant name="struts.devMode" value="true"/>
    <constant name="struts.rest.content.restrictToGET" value="false"/>
    <constant name="struts.rest.defaultExtension" value="json"/>
    <constant name="struts.rest.handlerOverride.EXTENSION" value="json"/>
    <constant name="struts.i18n.encoding" value="UTF-8"/>

    <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="/receipt: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="receipto"/>
    <constant name="struts.convention.package.locators" value="controllers,actions"/>
</struts>

ReceiptController.java:

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()
    {
        return (list==null ? model : list);
    }

    public HttpHeaders create()
    {
        receiptManager.save(model);
        return new DefaultHttpHeaders("create");
    }


    public HttpHeaders show()
    {
        model = receiptManager.find(id);
        return new DefaultHttpHeaders("show");
    }

    public HttpHeaders update()
    {
        receiptManager.save(model);
        return new DefaultHttpHeaders("update");
    }

    public HttpHeaders destroy()
    {
        model = receiptManager.destroy(id);
        return new DefaultHttpHeaders("destroy");
    }

    public HttpHeaders index()
    {
        list = receiptManager.list();
        return new DefaultHttpHeaders("index").disableCaching();
    }

    public String getId()
    {
        return id;
    }

    public void setId(String id)
    {
        this.id = id;
    }
}

それは私が望むように機能するはずですか、それともプラグインがどのように機能するのでしょうか?

4

1 に答える 1

4

郵便配達員がリクエストの本文で JSON を送信し、 content type を設定していると思いますapplication/jsonjsonインターセプターをスタックに追加すると、Struts はリクエストを解析できます。

<interceptor-stack name="myStack">
    <interceptor-ref name="json"/>
    <interceptor-ref name="myInterceptor"/>
    <interceptor-ref name="defaultStack"/>
</interceptor-stack>

JSON プラグイン"json"のインターセプターの説明:

インターセプターが使用される場合、アクションはリクエストの JSON コンテンツから入力されます。これらはインターセプターのルールです。

  • 「コンテンツタイプ」は「application/json」でなければなりません
  • JSON コンテンツは整形式でなければなりません。文法についてはjson.orgを参照してください。
  • アクションには、データを入力する必要があるフィールドのパブリック「セッター」メソッドが必要です。
  • ポピュレーションでサポートされている型は、プリミティブ (int、long...String)、日付、リスト、マップ、プリミティブ配列、その他のクラス (詳細は後述)、およびその他のクラスの配列です。
  • リストまたはマップ内に入力される JSON のすべてのオブジェクトは Map (プロパティから値へのマッピング) 型になり、整数は Long 型になり、10 進数は Double 型になります。リスト型の任意の配列。

資力:

于 2014-12-29T09:51:26.117 に答える