Spring MVCポートレットコントローラーから「JSON」を返す回避策を見つけました。これが私がやった方法です。
私のコントローラーで:
@ResourceMapping("ajaxTest")
public void ajaxHandler(ResourceRequest request, ResourceResponse response)
throws IOException {
OutputStream outStream = response.getPortletOutputStream();
StringBuffer buffer = new StringBuffer();
Map<String, String> testMap = new HashMap<String, String>();
testMap.put("foo", "bar");
String test = new JSONObject(testMap).toString();
buffer.append(test);
outStream.write(buffer.toString().getBytes());
}
「view.jsp」では:
<portlet:resourceURL var="ajaxtest" id="ajaxTest"/>
<script type="text/javascript">
$.get('<%= ajaxtest %>', function(response) {
var json = eval('(' + response + ')');
});
</script>
@ResourceMapping アノテーションは現在、JSON を返すことをサポートしていないため、org.json.JSONObject を使用してマップを JSON オブジェクトに変換し、このオブジェクトの toString() を返しました。@ResourceMapping の値は、resourceURL の ID と一致する必要があります。JSON 文字列を Javascript に変換するために eval を使用すると、セキュリティ上のリスクが生じますが、これは最も単純な例であるため、ここに含めました。セキュリティが心配な場合は、JSON パーサーを使用してください。