在grails中处理来自服务的错误
我的代码有问题。我如何处理gsp服务中的错误?我用render from service或controller进行了尝试,但是类似于类[{1}]的值为[{2}]的[Property[{0}]不是有效的电子邮件地址]的东西出现了错误500:内部服务器错误,带有完整的异常跟踪。我的资料来源: UserController.groovy在grails中处理来自服务的错误,grails,grails-validation,Grails,Grails Validation,我的代码有问题。我如何处理gsp服务中的错误?我用render from service或controller进行了尝试,但是类似于类[{1}]的值为[{2}]的[Property[{0}]不是有效的电子邮件地址]的东西出现了错误500:内部服务器错误,带有完整的异常跟踪。我的资料来源: UserController.groovy def saveUser() { def salt = new SecureRandomNumberGenerator().nextBytes().getB
def saveUser() {
def salt = new SecureRandomNumberGenerator().nextBytes().getBytes()
def user
try {
user = userService.registerMethod(params.username, params.passwordHash, params.passwordHash2,
salt, params.firstName, params.lastName, params.sex, params.email, params.mobile, params.userType)
session.user = user
flash.message = "User ${user.profile.firstName} ${user.profile.lastName} was successfuly created!"
redirect(uri:"/")
} catch (UserRegistrationException ure) {
user = ure.user
if (user) {
render(view:"registration",model:[user:user])
} else {
flash.message = ure.message
redirect(action:"registration")
}
}
}
class UserRegistrationException extends RuntimeException {
String message
User user
}
class UserService {
boolean transactional = true
User registerMethod(String username, String password1, String password2, Object salt, String firstName, String lastName,
String sex, String email, String mobile, String userType) {
def user = User.findByUsername(username)
if(user) {
//flash.message = "User already exists with login ${username}"
throw new UserRegistrationException(message:"User already exists with login ${username}")
redirect(uri:"/")
} else {
if (password1 != password2) {
//flash.message = "Passwords don't match"
throw new UserRegistrationException(message:"Passwords don't match")
} else {
def profile = Profile.findByEmail(email)
if (profile && (email == profile.email)) {
//flash.message = "User with this email is already exists!"
throw new UserRegistrationException(message:"User with this email is already exists!")
} else {
user = new User(
username:username,
passwordHash: new Sha512Hash(password1, salt, 1024).toHex(),
passwordSalt:salt,
profile: new Profile(
firstName:firstName,
lastName:lastName,
sex:sex,
email:email,
mobile:mobile,
userType:userType
)
)
if (!user.hasErrors() && user.save(flush:true,failOnError:true)) {
def authToken = new UsernamePasswordToken(username, password1)
SecurityUtils.subject.login(authToken)
return user
} else {
throw new UserRegistrationException(message:"Can't create user");
}
}
}
}
}
UserService.groovy
def saveUser() {
def salt = new SecureRandomNumberGenerator().nextBytes().getBytes()
def user
try {
user = userService.registerMethod(params.username, params.passwordHash, params.passwordHash2,
salt, params.firstName, params.lastName, params.sex, params.email, params.mobile, params.userType)
session.user = user
flash.message = "User ${user.profile.firstName} ${user.profile.lastName} was successfuly created!"
redirect(uri:"/")
} catch (UserRegistrationException ure) {
user = ure.user
if (user) {
render(view:"registration",model:[user:user])
} else {
flash.message = ure.message
redirect(action:"registration")
}
}
}
class UserRegistrationException extends RuntimeException {
String message
User user
}
class UserService {
boolean transactional = true
User registerMethod(String username, String password1, String password2, Object salt, String firstName, String lastName,
String sex, String email, String mobile, String userType) {
def user = User.findByUsername(username)
if(user) {
//flash.message = "User already exists with login ${username}"
throw new UserRegistrationException(message:"User already exists with login ${username}")
redirect(uri:"/")
} else {
if (password1 != password2) {
//flash.message = "Passwords don't match"
throw new UserRegistrationException(message:"Passwords don't match")
} else {
def profile = Profile.findByEmail(email)
if (profile && (email == profile.email)) {
//flash.message = "User with this email is already exists!"
throw new UserRegistrationException(message:"User with this email is already exists!")
} else {
user = new User(
username:username,
passwordHash: new Sha512Hash(password1, salt, 1024).toHex(),
passwordSalt:salt,
profile: new Profile(
firstName:firstName,
lastName:lastName,
sex:sex,
email:email,
mobile:mobile,
userType:userType
)
)
if (!user.hasErrors() && user.save(flush:true,failOnError:true)) {
def authToken = new UsernamePasswordToken(username, password1)
SecurityUtils.subject.login(authToken)
return user
} else {
throw new UserRegistrationException(message:"Can't create user");
}
}
}
}
}
}
注册。普惠制
<body>
<h1>Registration Page</h1>
<g:if test="${ flash.message }">
${ flash.message }
</g:if>
<g:hasErrors bean="${ user }">
<g:renderErrors bean="${ user }" as="list"/>
</g:hasErrors>
<div id="registration">
<g:form action="saveUser">
<table>
<tr>
<td><label for="username">Login: </label></td>
<td><g:textField name="username" id="username" /></td>
</tr>
<tr>
<td><label for="firstName">First Name: </label></td>
<td><g:textField name="firstName" id="firstName"/></td>
</tr>
<tr>
<td><label for="lastName">Last Name: </label></td>
<td><g:textField name="lastName" id="lastName"/></td>
</tr>
<tr>
<td><label for="sex">Sex: </label></td>
<td><g:radioGroup values="['M','F']" name="sex" labels="['Male','Female']">
<p>${ it.radio } ${ it.label }</p>
</g:radioGroup></td>
</tr>
<tr>
<td><label for="email">Email: </label></td>
<td><g:textField name="email" id="email"/></td>
</tr>
<tr>
<td><label for="mobile">Mobile: </label></td>
<td><g:textField name="mobile" id="mobile"/></td>
</tr>
<tr>
<td><label for="passwordHash">Password: </label></td>
<td><g:passwordField name="passwordHash" id="passwordHash"/></td>
</tr>
<tr>
<td><label for="passwordHash2">Confirm password: </label></td>
<td><g:passwordField name="passwordHash2" name="passwordHash2" id="passwordHash2" /></td>
</tr>
<tr>
<td><label for="userType">User Type: </label></td>
<td>
<g:radioGroup values="['F','H']" name="userType" labels="['Freelancer','Client']">
<p>${ it.radio } ${ it.label }</p>
</g:radioGroup>
</td>
</tr>
<tr>
<td><g:submitButton name="saveUser" value="Register"/> </td>
</tr>
</table>
</g:form>
</div>
</body>
注册页
${flash.message}
登录:
名字:
姓氏:
性别:
${it.radio}${it.label}
电邮:
流动电话:
密码:
确认密码:
用户类型:
${it.radio}${it.label}
也许我的代码有问题
我只想向用户显示一个错误,但不想显示您正在使用的
save(failOnError:true)
的完整异常跟踪,它将在您的保存失败时引发异常。由于您只捕获了UserRegistrationException
,因此save()
中的异常会产生500个内部服务器错误。您可以删除failOnError
,您的服务方法应该符合您的抛出新的UserRegistrationException
块的要求,并按照您的预期进行操作 我只想补充一点,将异常用于控制流不是很好的程序设计,而且非常昂贵。我建议删除UserRegistrationException
,而只返回一个布尔值false
,并在控制器中检查它。记住groovy方法是动态类型化的,您可以返回任何您想要的。伙计,您是我的救世主。最好注意返回false
的问题是您不知道它失败的原因。因此,如果通过,您可以返回null,如果失败,则返回消息。但由于null
被认为是“错误的”,因此将其传递给成功会让人感到奇怪。或者,您可以更新异常以不创建stacktrace,这将消除异常的大量成本。有关实现的详细信息,请参阅。