質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

Q&A

解決済

2回答

8760閲覧

Struts2のjson-pluginでjsonデータをpostで受け取りたい

_kato

総合スコア149

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Struts 2

Apache Struts 2は、Apache Strutsプロジェクトにて開発されているオープンソースのJavaベースのWebアプリケーションフレームワークです。Sturts1に比べ、設定ファイルの削減、依存性の注入、POJO等の改善がなされています。

0グッド

0クリップ

投稿2016/12/24 02:24

###前提・実現したいこと
struts-config.xmlでactionメソッドごとにresultでtype="json"を指定すると実現できるが、
convention-pluginを利用しているので同様なことをアノテーションで実現したいがうまく動作しない。
convention-plugin、json-pluginだけの、ZeroConfigurationで実現したい。

※他のアクションは全てアノテーションを使っているのでjsonデータのpostの部分だけ、
struts-config.xmlでの設定を併用はしたくなく、仕方がないので今は、postデータをjson形式ではなく
シリアライズした文字列としてサーバに渡し、json-pluginを使わずアクションメソッド内でjacksonで
自力でデシリアライズするようにしています。

###発生している問題・エラーメッセージ
struts-config.xmlで指定した場合は、メソッドが呼ばれたときに、actionクラスで定義している
オブジェクトに自動でjsonデータが格納されている(List<POJOクラス>型のオブジェクト)
アノテーションの設定だけでやろうとしても上記のオブジェクトは、どうしてもnullになる。
※アノテーションでの同様の設定の仕方がわからない。

###該当のソースコード

(java) @ParentPackage("json-default") @Results({ @Result(name="json", type="json", params={"root","data", "noCache","true"}), @Result(name="exception", location="/exception.jsp") }) public class SampleAction extends Action { private List<POJO> data; //with setter,getter @Action("set-data") //@Actioにresults={@Result(type="json",params={"enableSMD","true"})}を指定してもダメ public String setData() { System.out.println(data); //data=null(デシリアライズされない) return successValue; } } (jsp) $("#button").click(function(e) { $.ajax({ url: 'set-data.action', type: 'post', data: '{"data":' + JSON.stringify(arrayData) + '}', dataType: 'json', contentType:"application/json;charset=utf-8", success: function (res) { console.debug(res); } }); });

###試したこと
struts-config.xmlで指定するとちゃんとオブジェクトにデシリアライズされる
(参考)http://stackoverflow.com/questions/19566700/how-to-use-jquery-to-post-json-data-to-a-struts2-action-class

(struts-config.xml) <package name="sample.action" namespace="/" extends="json-default"> <action name="set-data" class="sample.action.SampleAction" method="setData"> <result type="json"> <param name="enableSMD">true</param> </result> </action> </package> ※<param name="enableSMD">true</param>は指定しなくても動作した。

###補足情報(言語/FW/ツール等のバージョンなど)
struts2-2.3.20

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

struts.xmlによる定義と、@Actionなどの併用を色々試しましたがうまく動作しませんでした。
アノテーションを利用するのが今回の目的のため、頂いた回答をもとに、アノテーションだけの
設定で実現できました(struts.xmlには何も記述なし)
@Action内に、@Interceptorを設定する必要あり

(struts.xml) 記述なし (java) @ParentPackage("json-default") @Results({ @Result(name="json", type="json", params={"root","data", "noCache","true"}) }) public class ConfigAction extends Pg2BaseAction { private List<POJO> data; @Action(value="set-data", interceptorRefs={@InterceptorRef(value="json", params={"enableSMD", "true"})}) public String setData(){ System.out.println(data); return success(); } } (jsp) $("#button").click(function(e) { $.ajax({ url: 'set-data.action', type: 'post', data: '{"data":' + JSON.stringify(jsonArray) + '}', dataType: 'json', contentType:"application/json;charset=utf-8", success: function (res) { alert(res); } }); });

投稿2016/12/28 06:51

_kato

総合スコア149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

AJAXの受け手となるActionに値を滑り込ませているのはJSONInterceptorなので、
このインターセプタに「enableSMD=true」を渡せば解決する?気がします。

手元に試せる環境がないので、無試験で申し訳ないですが、
「struts.xml」の「json-default」な定義部分に、ref設定してparam与えて、

XML

1<package name="jsonDefault" extends="json-default"> 2 <result-types> 3 <result-type name="json" class="org.apache.struts2.json.JSONResult"/> 4 </result-types> 5 <interceptors> 6 <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/> 7 <interceptor-stack name="ajaxDefaultStack"> 8 <interceptor-ref name="json"> 9 <param name="enableSMD">true</param> 10 </interceptor-ref> 11 </interceptor-stack> 12 </interceptors> 13 <default-interceptor-ref name="ajaxDefaultStack" /> 14</package>

の、ような書きっぷりでおそらく渡せると思います。

参考にしたのは、JSON Pluginの、Excluding propertiesの書きっぷりです。

重ねてですが、当方試験したわけではないので動かなかったらごめんなさい。

投稿2016/12/26 10:04

akio221

総合スコア716

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_kato

2016/12/28 06:31

ご回答ありがとうございます。 頂いた設定と@Actionアノテーションの併用ではうまくいきませんでした。 (頂いた設定とstruts.xml内の<action>タグの設定だと動作いたします) アノテーションを利用するのが目的のため、回答頂いた方法を参考にして、 別の方法で解決できましたので解決方法に記載いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問