4

コードに問題があります。サービスからgspへのエラーをどのように処理できますか?サービスまたはコントローラーからのレンダリングで試しましたが、代わりに[クラス[{1}]のプロパティ[{0}]の値[{2}]は有効な電子メールアドレスではありません]のようなものでエラー500が発生しました。完全な例外トレースを伴う内部サーバーエラー。私の情報源:

UserController.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")
        }
    }

}

UserService.groovy

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");
                }
            }
        }
    }
}

}

register.gsp

<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>

たぶん私のコードに何か問題がありますか?

ユーザーにエラーを表示したいのですが、完全な例外トレースは表示しません

4

2 に答える 2

4

save(failOnError:true)保存が失敗したときに例外がスローされる原因となるものを使用しています。のみをキャッチしているためUserRegistrationException、からの例外save()は 500 内部サーバー エラーを生成しています。を削除するfailOnErrorと、サービス メソッドがthrow new UserRegistrationExceptionブロックにフォールスルーし、期待どおりに動作するはずです。

于 2012-06-26T18:41:07.070 に答える
2

例外を制御フローに使用することは、適切なプログラム設計ではなく、非常に高価であることを付け加えたいと思います。を削除しUserRegistrationException、代わりにブール値のみを返しfalse、コントローラーでそれを確認することをお勧めします。Groovy メソッドは動的に型付けされ、必要なものを何でも返すことができることに注意してください。

于 2014-03-06T12:22:29.090 に答える