Copy link to clipboard
Copied
Well, this is an extremely frustrating function. Especially for produces="application/json"
Depending on what you set the status to, your content is overridden by messages or default templates.
A few test functions:
status 401, 404 return body with html default template instead of specified content
//test function for 404 - returns html default template
remote void function notfound()
httpmethod="GET"
restpath="/not-found"
{
response = {
content: "Oops, not found",
status: 404
};
restSetResponse(response);
}
status 422 returns body with html "The custom error module does not recognize this error."
//test function for 422 - returns "The custom error module does not recognize this error."
remote void function UnprocessableEntity()
httpmethod="GET"
restpath="/unprocessable-entity"
{
response = {
content: "Oops, unprocessable entity",
status: 422
};
restSetResponse(response);
}
The purpose of having produces="application/json" was to always have the body/content a JSON structure -
which obviously isn't going to happen if my content is ignored. For example -
//json structure for errors
private Struct function handlerError( required string funcName, required any e)
{
var funcResp = structNew();
funcResp.error = true;
funcResp.msg = ARGUMENTS.e.message;
funcResp.type = ARGUMENTS.funcName & " -> " & ARGUMENTS.e.type;
funcResp.error_code = ARGUMENTS.e.errorCode;
return SerializedJSON(funcResp);
}
// should return for 422
{"error":true,"msg":"Oops, unprocessable entity","type":"Unprocessible Entity","error_code":"422"}
// should return for 404
{"error":true,"msg":"Oops, not found","type":"Not Found","error_code":"404"}
How can I override the override, so my content is returned in the body?
Environment: Windows Server 2012R2 v6.2, CF2016, IIS v8
When you serialize to JSON you essentially get a string. But, here, your function is returning a struct instead.
So, you should modify the code to something like
private String function handlerError( required string funcName, required any e)
{
var funcResp = structNew();
funcResp.error = true;
funcResp.msg = ARGUMENTS.e.message;
funcResp.type = ARGUMENTS.funcName & " -> " & ARGUMENTS.e.type;
funcResp.error_code = ARGUMENTS.e.errorCode;
re
...
Copy link to clipboard
Copied
When you serialize to JSON you essentially get a string. But, here, your function is returning a struct instead.
So, you should modify the code to something like
private String function handlerError( required string funcName, required any e)
{
var funcResp = structNew();
funcResp.error = true;
funcResp.msg = ARGUMENTS.e.message;
funcResp.type = ARGUMENTS.funcName & " -> " & ARGUMENTS.e.type;
funcResp.error_code = ARGUMENTS.e.errorCode;
return serializeJson(funcResp);
}
Copy link to clipboard
Copied
Thank you for pointing out what should have been staring me in the face!