使用FacebookAuthService FacebookProfile的Spring Security Facebook自定义返回空值

使用FacebookAuthService FacebookProfile的Spring Security Facebook自定义返回空值,facebook,grails,facebook-login,Facebook,Grails,Facebook Login,我已经实现了Spring security facebook插件,它可以与默认的FacebookAuthService配合使用,但是当我通过创建FacebookAuthService.groovy自定义它以获取facebook用户详细信息时,当单击“使用facebook登录”按钮时,它会给出以下错误消息 Belw是FacebookUser从FacebookAuthService创建方法的快照: FacebookUser create(FacebookAuthToken token) {

我已经实现了Spring security facebook插件,它可以与默认的FacebookAuthService配合使用,但是当我通过创建FacebookAuthService.groovy自定义它以获取facebook用户详细信息时,当单击“使用facebook登录”按钮时,它会给出以下错误消息

Belw是FacebookUser从FacebookAuthService创建方法的快照:

FacebookUser create(FacebookAuthToken token) {
        Facebook facebook = new FacebookTemplate(token.accessToken.accessToken)
        FacebookProfile fbProfile = facebook.userOperations().userProfile
        String email = fbProfile.email
        String username = fbProfile.username
        String firstName = fbProfile.firstName
        String lastName = fbProfile.lastName

        User person = new User(
                username: username,
                password: token.accessToken.accessToken, //not really necessary
                enabled: true,
                accountExpired:  false,
                accountLocked: false,
                passwordExpired: false,

                //fill with data loaded from Facebook API
                name: [firstName, lastName].join(' '),
                email: email
        )
        person.save()
        UserRole.create(person, Role.findByAuthority('ROLE_USER'))
        UserRole.create(person, Role.findByAuthority('ROLE_FACEBOOK'))
        FacebookUser fbUser = new FacebookUser(
                uid: token.uid,
                accessToken: token.accessToken.accessToken,
                accessTokenExpires: token.accessToken.expireAt,
                user: person
        )
        fbUser.save()
        return fbUser
    }
Error |
2015-01-11 15:15:47,948 [http-bio-8080-exec-4] ERROR [/TESTAPP].[default]  - Servlet.service() for servlet [default] in context with path [/TESTAPP] threw exception
Message: Validation Error(s) occurred during save():
- Field error in object 'com.testapp.User' on field 'email': rejected value [null]; codes [com.testapp.User.email.nullable.error.com.testapp.User.email,com.testapp.User.email.nullable.error.email,com.testapp.User.email.nullable.error.java.lang.String,com.testapp.User.email.nullable.error,user.email.nullable.error.com.testapp.User.email,user.email.nullable.error.email,user.email.nullable.error.java.lang.String,user.email.nullable.error,com.testapp.User.email.nullable.com.testapp.User.email,com.testapp.User.email.nullable.email,com.testapp.User.email.nullable.java.lang.String,com.testapp.User.email.nullable,user.email.nullable.com.testapp.User.email,user.email.nullable.email,user.email.nullable.java.lang.String,user.email.nullable,nullable.com.testapp.User.email,nullable.email,nullable.java.lang.String,nullable]; arguments [email,class com.testapp.User]; default message [Property [{0}] of class [{1}] cannot be null]
- Field error in object 'com.testapp.User' on field 'name': rejected value [null]; codes [com.testapp.User.name.nullable.error.com.testapp.User.name,com.testapp.User.name.nullable.error.name,com.testapp.User.name.nullable.error.java.lang.String,com.testapp.User.name.nullable.error,user.name.nullable.error.com.testapp.User.name,user.name.nullable.error.name,user.name.nullable.error.java.lang.String,user.name.nullable.error,com.testapp.User.name.nullable.com.testapp.User.name,com.testapp.User.name.nullable.name,com.testapp.User.name.nullable.java.lang.String,com.testapp.User.name.nullable,user.name.nullable.com.testapp.User.name,user.name.nullable.name,user.name.nullable.java.lang.String,user.name.nullable,nullable.com.testapp.User.name,nullable.name,nullable.java.lang.String,nullable]; arguments [name,class com.testapp.User]; default message [Property [{0}] of class [{1}] cannot be null]
    Line | Method
->>  145 | doCall                in com.the6hours.grails.springsecurity.facebook.DefaultFacebookAuthDao$_create_closure4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    814 | withTransaction       in org.grails.datastore.gorm.GormStaticApi
|    714 | withTransaction . . . in     ''
|    144 | create                in com.the6hours.grails.springsecurity.facebook.DefaultFacebookAuthDao
|     72 | authenticate . . . .  in com.the6hours.grails.springsecurity.facebook.FacebookAuthProvider
|     58 | attemptAuthentication in com.the6hours.grails.springsecurity.facebook.FacebookAuthRedirectFilter
|     46 | doFilter . . . . . .  in     ''
|     82 | doFilter              in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|   1110 | runWorker . . . . . . in java.util.concurrent.ThreadPoolExecutor
|    603 | run                   in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run . . . . . . . . . in java.lang.Thread
显示的错误为:

FacebookUser create(FacebookAuthToken token) {
        Facebook facebook = new FacebookTemplate(token.accessToken.accessToken)
        FacebookProfile fbProfile = facebook.userOperations().userProfile
        String email = fbProfile.email
        String username = fbProfile.username
        String firstName = fbProfile.firstName
        String lastName = fbProfile.lastName

        User person = new User(
                username: username,
                password: token.accessToken.accessToken, //not really necessary
                enabled: true,
                accountExpired:  false,
                accountLocked: false,
                passwordExpired: false,

                //fill with data loaded from Facebook API
                name: [firstName, lastName].join(' '),
                email: email
        )
        person.save()
        UserRole.create(person, Role.findByAuthority('ROLE_USER'))
        UserRole.create(person, Role.findByAuthority('ROLE_FACEBOOK'))
        FacebookUser fbUser = new FacebookUser(
                uid: token.uid,
                accessToken: token.accessToken.accessToken,
                accessTokenExpires: token.accessToken.expireAt,
                user: person
        )
        fbUser.save()
        return fbUser
    }
Error |
2015-01-11 15:15:47,948 [http-bio-8080-exec-4] ERROR [/TESTAPP].[default]  - Servlet.service() for servlet [default] in context with path [/TESTAPP] threw exception
Message: Validation Error(s) occurred during save():
- Field error in object 'com.testapp.User' on field 'email': rejected value [null]; codes [com.testapp.User.email.nullable.error.com.testapp.User.email,com.testapp.User.email.nullable.error.email,com.testapp.User.email.nullable.error.java.lang.String,com.testapp.User.email.nullable.error,user.email.nullable.error.com.testapp.User.email,user.email.nullable.error.email,user.email.nullable.error.java.lang.String,user.email.nullable.error,com.testapp.User.email.nullable.com.testapp.User.email,com.testapp.User.email.nullable.email,com.testapp.User.email.nullable.java.lang.String,com.testapp.User.email.nullable,user.email.nullable.com.testapp.User.email,user.email.nullable.email,user.email.nullable.java.lang.String,user.email.nullable,nullable.com.testapp.User.email,nullable.email,nullable.java.lang.String,nullable]; arguments [email,class com.testapp.User]; default message [Property [{0}] of class [{1}] cannot be null]
- Field error in object 'com.testapp.User' on field 'name': rejected value [null]; codes [com.testapp.User.name.nullable.error.com.testapp.User.name,com.testapp.User.name.nullable.error.name,com.testapp.User.name.nullable.error.java.lang.String,com.testapp.User.name.nullable.error,user.name.nullable.error.com.testapp.User.name,user.name.nullable.error.name,user.name.nullable.error.java.lang.String,user.name.nullable.error,com.testapp.User.name.nullable.com.testapp.User.name,com.testapp.User.name.nullable.name,com.testapp.User.name.nullable.java.lang.String,com.testapp.User.name.nullable,user.name.nullable.com.testapp.User.name,user.name.nullable.name,user.name.nullable.java.lang.String,user.name.nullable,nullable.com.testapp.User.name,nullable.name,nullable.java.lang.String,nullable]; arguments [name,class com.testapp.User]; default message [Property [{0}] of class [{1}] cannot be null]
    Line | Method
->>  145 | doCall                in com.the6hours.grails.springsecurity.facebook.DefaultFacebookAuthDao$_create_closure4
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    814 | withTransaction       in org.grails.datastore.gorm.GormStaticApi
|    714 | withTransaction . . . in     ''
|    144 | create                in com.the6hours.grails.springsecurity.facebook.DefaultFacebookAuthDao
|     72 | authenticate . . . .  in com.the6hours.grails.springsecurity.facebook.FacebookAuthProvider
|     58 | attemptAuthentication in com.the6hours.grails.springsecurity.facebook.FacebookAuthRedirectFilter
|     46 | doFilter . . . . . .  in     ''
|     82 | doFilter              in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
|   1110 | runWorker . . . . . . in java.util.concurrent.ThreadPoolExecutor
|    603 | run                   in java.util.concurrent.ThreadPoolExecutor$Worker
^    722 | run . . . . . . . . . in java.lang.Thread
据我所知,我认为facebook.userOperations().userProfile无法检索facebook用户详细信息。
有人能帮我一下吗?或者我有什么遗漏吗?

它看起来像
fbProfile。email
fbProfile.name
为空,因此违反了
用户的约束。或者……是的,Facebook提供的值可能是
null
(对于空用户,或者如果用户不想共享此信息)。你可能需要一个变通办法,比如在你的应用程序中向用户索要电子邮件和姓名,或者其他什么。是的,facebook正在为这些字段返回空值。我已经照预期处理了它和它的工作。非常感谢您的回复。