我需要在适当的位置显示从服务中收到的一些验证消息,我解决了它将消息放在异常中:
class InvalidInputException extends RuntimeException {
def errors
InvalidInputException(String s) {
super(s)
}
InvalidInputException(String s, errors) {
super(s)
this.errors = errors
}
}
这样,我可以抛出发送错误的异常:
if (errors) {
throw new InvalidInputException("There were some errors", errors)
}
..然后我在捕获异常之后在控制器中处理错误:
...
catch (InvalidInputException e) {
if (e.errors) {
// set them up to display appropriately
}
// render the view
}
现在,我已经在某处看到Groovy的例外情况会花费太多,所以......这太糟糕了吗? 在异常中添加其他数据可能会遇到什么问题?
这比摆弄返回的错误消息容易得多,而且代码要短得多。
答案 0 :(得分:2)
如果您担心Java中的异常性能,建议您查看other question。
如果不创建异常,另一种可能性是使服务返回一个表示此流结果的对象。类似的东西:
class MyServiceResult {
List<String> errorCodes = [] //codes for i18n
void addErrorCode(String errorCode) {
errorCodes << errorCode //add error to list
}
boolean isValid() {
return (!(errorCodes.size() > 0)) //if we have errors then isn't valid.
}
List<String> getErrorCodes() {
return errorCodes.asImmutable()
}
}
只需在您的服务方法中使用它
class MyService {
MyServiceResult someMethod() {
MyServiceResult result = new MyServiceResult()
...
result.addErrorCode('some.key.here')
...
return result
}
}
class MyController {
def myService
def action() {
MyServiceResult result = myService.someMethod()
if(!result.isValid()) {
//handle errors
}
}
}
但重要的是要说它比创建例外要慢2倍。您可以查看this post中的所有详细信息。