realidad me di cuenta de que era una línea en el resto de plugins causando esto:
// don't return any content for PUT, DELETE, and POST where there are no errors
if (!hasErrors && !"get".equalsIgnoreCase(ServletActionContext.getRequest().getMethod())) {
target = null;
}
Esto está en org.apache.struts2.rest.RestActionInvocation
en el método selectTarget()
. Encuentro esto bastante molesto ya que realmente no sigue la arquitectura REST, id como la opción de poder devolver los objetos de respuesta para las solicitudes POST, DELETE y PUT en algunos casos.
trabajé en torno a esta extendiendo RestActionProxyFactory
y RestActionInvocation
y especificando el uso de XML en mi puntales de este modo:
<bean type="com.opensymphony.xwork2.ActionProxyFactory" name="restOverride" class="uk.co.ratedpeople.tp.rest.RPRestActionProxyFactory" />
<constant name="struts.actionProxyFactory" value="restOverride" />
Esto me permite utilizar los puntales plugin de largo mientras que volvía objeto en las peticiones POST.
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;
// }
}
}
no pude encontrar una forma de evitar esto, pero me decidí por alterar el código de respuesta mediante la devolución de DefaultHttpHeaders vez del éxito. Creo que esta podría ser la forma de ir con las solicitudes POST y PUT. – noShowP
Hola, también estoy usando struts2-rest-plugin y tengo problemas para que el método update() acepte una carga útil JSON y la asigne correctamente al modelo. ¿Te importa compartir cómo lo hiciste? Gracias. – shaunlim