私は実際にそれがこの原因プラグイン残りの部分でラインだったことを考え出し:
// don't return any content for PUT, DELETE, and POST where there are no errors
if (!hasErrors && !"get".equalsIgnoreCase(ServletActionContext.getRequest().getMethod())) {
target = null;
}
これはselectTarget()
方法でorg.apache.struts2.rest.RestActionInvocation
であるが。 POST、DELETE、およびPUT要求に対する応答オブジェクトを返すことができるオプションのように、実際にはRESTアーキテクチャに従わないため、これはかなり厄介なものです。
は私がRestActionProxyFactory
とRestActionInvocation
を拡張し、そのように私の支柱をXMLでこれを使用することを指定することでこの問題を回避働いていた:これは私がストラットはPOSTリクエストでオブジェクトを戻しながら全体のプラグインを使用することができます
<bean type="com.opensymphony.xwork2.ActionProxyFactory" name="restOverride" class="uk.co.ratedpeople.tp.rest.RPRestActionProxyFactory" />
<constant name="struts.actionProxyFactory" value="restOverride" />
。
RestActionProxyFactory
public class RPRestActionProxyFactory extends RestActionProxyFactory {
@Override
public ActionProxy createActionProxy(String namespace, String actionName, String methodName, Map extraContext, boolean executeResult, boolean cleanupContext) {
if (namespace.startsWith(this.namespace)) {
ActionInvocation inv = new RPRestActionInvocation(extraContext, true);
container.inject(inv);
return createActionProxy(inv, namespace, actionName, methodName, executeResult, cleanupContext);
} else {
return super.createActionProxy(namespace, actionName, methodName, extraContext, executeResult, cleanupContext);
}
}
}
RestActionInvocation
public class RPRestActionInvocation extends RestActionInvocation {
public RPRestActionInvocation(Map extraContext, boolean pushAction) {
super(extraContext, pushAction);
}
@SuppressWarnings("unchecked")
@Override
protected void selectTarget() {
// Select target (content to return)
Throwable e = (Throwable)stack.findValue("exception");
if (e != null) {
// Exception
target = e;
hasErrors = true;
} else if (action instanceof ValidationAware && ((ValidationAware)action).hasErrors()) {
// Error messages
ValidationAware validationAwareAction = ((ValidationAware)action);
Map errors = new HashMap();
if (validationAwareAction.getActionErrors().size() > 0) {
errors.put("actionErrors", validationAwareAction.getActionErrors());
}
if (validationAwareAction.getFieldErrors().size() > 0) {
errors.put("fieldErrors", validationAwareAction.getFieldErrors());
}
target = errors;
hasErrors = true;
} else if (action instanceof ModelDriven) {
// Model
target = ((ModelDriven)action).getModel();
} else {
target = action;
}
// don't return any content for PUT, DELETE, and POST where there are no errors
// if (!hasErrors && !"get".equalsIgnoreCase(ServletActionContext.getRequest().getMethod())) {
// target = null;
// }
}
}
上の最後の設定を参照してください、私はこれを回避する方法を見つけることができませんでしたが、私は代わりにDefaultHttpHeadersを返すことによって応答コードを変更することで決着しました成功の私は、これがPOSTリクエストとPUTリクエストと一緒に行く方法かもしれないと思う。 – noShowP
こんにちは、struts2-rest-pluginも使用していますが、update()メソッドを取得してJSONペイロードを受け取り、モデルに正しくマップするのに問題があります。あなたはそれをどうやって共有してもらえますか?ありがとう.. – shaunlim