如何检查Grails控制器操作是否已为此操作方法提供了所有必需参数。换句话说,我可以简单地使用地图或列表对象来指定我的操作所需的所有参数。
我可以获取参数并对每个动作进行明确检查,但这只是为了简单验证而已。是否有一种简单的方法,以便返回缺少参数名称的默认错误消息。
修改
我认为有两件事我忘了提及 - 1.这些控制器操作用于实现Web服务,并且它们不与GSP链接。 2.所需的参数需要因行动而异。使用命令对象记住这一点似乎不正确的方法。每个方法都会有不同的必需参数,我们无法为每个Web服务创建命令对象。
Spring有类似的东西,我们可以为每个动作指定,这些是params以及它们是必需的还是可选的。
答案 0 :(得分:2)
如果您使用params中的数据来填充Domain类的实例,则可以相应地设置约束,填充域类的实例,并使用validate方法。
如果您要验证的数据与Domain类并不真正相关,您仍然可以通过创建Command Object并在控制器操作中指定它来使用相同的验证机制。
这是docs的命令对象示例:
@grails.validation.Validateable
class LoginCommand {
String username
String password
static constraints = {
username(blank: false, minSize: 6)
password(blank: false, minSize: 6)
}
}
然后在控制器中:
class LoginController {
def login(LoginCommand cmd) {
if (cmd.hasErrors()) {
redirect(action: 'loginForm')
return
}
// work with the command object data
}
}
the docs的相关引用:
在执行控制器操作之前,Grails会自动执行 创建命令对象类的实例并填充它 通过绑定请求参数的属性。如果是命令对象 class用Validateable标记,然后命令对象就是 验证
答案 1 :(得分:2)
Command
在这些场景中,对象很方便。您可以使用params
绑定定义命令对象,并在每个/所有绑定上添加约束。您还可以使用自定义validator
来验证请求参数(params
)。
例如:
//Command Object
class LoginCommand{
String userName
String password
static constraints = {
//Constraints and validator defined here
}
}
在Controller中访问命令对象:
def myAction(LoginCommand lc){
if(lc.hasErrors()){//redirect to error page or do something else}
}
您可以找到更多详情here。
在命令对象中放置请求参数验证的优点是:
params
期间动态绑定到action
,因此它们可以充当业务对象/ bean,您可以在其中处理域(应用程序业务域)相关逻辑。 / LI>
醇>
<强>更新强>
以下sample code {{3}}命令对象如何用于actions
中所有controller
的验证。