Liferay 7 MVC 资源命令:在 return 值上与 JS 反应

Liferay 7 MVC Resource Command: react with JS on return value

我有一个 Liferay 7.3 MVC 资源命令,它是这样的:

public boolean serveResource(
        ResourceRequest resourceRequest, ResourceResponse resourceResponse) {    
 try {
   // my code goes here

   return false;
 }catch(Exception e){
  
  return true;
 }
}

我从 JavaScript 调用这个命令是这样的:

var req = new XMLHttpRequest();
req.open("POST", '${upload}', true)

req.onload = function (event) {
    console.log("success");
}
           
req.onerror = function (event) {
    console.log("error");      
}

// do request
req.send(form_data);

现在的问题是,当 MVC ResourceCommands 在 catch 子句中发回 true 时,总是会调用“onload”函数。

所以我的问题是:我如何在 JavaScript 中知道我的 ResourceCommand 何时成功?

Javadoc 对布尔 return 类型的用途不是很清楚。特别是 GenericPortlet.serveResource 有一个 void return 类型。

但是,考虑一下您的 // my code goes here 块中可能发生的事情会使预期的结果更加清晰:客户端不能依赖返回信号的布尔结果:您可以(并且通常会)访问ResourceResponse 的输出流,发送所有你喜欢的数据,当你最终从这段代码中 return true; 时,它可以在客户端很长时间。这意味着框架没有机会拦截或重定向任何已经进行的通信。

此外,一个简单的 true/false return 值无法让您控制向客户端发出何种错误信号。是401吗? 404? 418? 500?或者它会 return 200 并带有 HTML 错误消息吗? JSON 编码错误?

如果您依赖于此操作的结果:保持对它的控制。我无法告诉您布尔 return 值的用途,但它不是为了浏览器的利益。您决定是将 HTTP 状态代码用于错误信号还是特定负载。一旦你实现了它,你就会知道在 JS 方面会发生什么。

请记住,在将任何数据发送回客户端之前,您必须决定是“正常情况”还是“错误情况”。如果您开始向客户端传递“ok”结果并突然 运行 进入异常,您可能已经将其一半传递给客户端,但不能依赖于换马,例如您无法重新开始,因为响应可能已经(一半)发送到浏览器,所以发送错误消息。