2012-09-26 55 views
0

我正在为liferay编写自动登录钩子,它尝试通过screenname获取用户。我用下面的代码来获得用户,这主要是OpenSSOAutoLogin变化:Liferay无法通过screenname获取用户

User user = UserLocalServiceUtil.getUserByScreenName(companyId, screenName);

这在大多数情况下,除非它被记录在Liferay的屏幕名是大写的。例如,如果屏幕名称存储的liferay是'TEST',我无法获得用户。堆栈跟踪显示如下:

com.liferay.portal.NoSuchUserException: No User exists with the key {companyId=1, screenName=test} 
    at com.liferay.portal.service.persistence.UserPersistenceImpl.findByC_SN(UserPersistenceImpl.java:2789) 
    at com.liferay.portal.service.impl.UserLocalServiceImpl.getUserByScreenName(UserLocalServiceImpl.java:2590) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:122) 
    at com.liferay.portal.spring.transaction.TransactionInterceptor.invoke(TransactionInterceptor.java:71) 
    at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:118) 
    at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:57) 
    at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:118) 
    at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:57) 
    at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:118) 
    at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:57) 
    at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:118) 
    at com.liferay.portal.spring.aop.ChainableMethodAdvice.invoke(ChainableMethodAdvice.java:57) 
    at com.liferay.portal.spring.aop.ServiceBeanMethodInvocation.proceed(ServiceBeanMethodInvocation.java:118) 
    at com.liferay.portal.spring.aop.ServiceBeanAopProxy.invoke(ServiceBeanAopProxy.java:211) 
    at $Proxy103.getUserByScreenName(Unknown Source) 
    at com.liferay.portal.service.UserLocalServiceUtil.getUserByScreenName(UserLocalServiceUtil.java:1625) 
    at me.and.my.business.MyAutoLogin.login(MyAutoLogin.java:175) 

跟踪清楚地表明“没有用户存在关键screenName = test”。这里'test'是用小写字母编写的,但getUserByScreenName()方法是用大写的screenname调用的。

经过一番研究,我发现在liferay UserLocalServiceImpl中执行了小写转换。我想这是导致搜索失败的原因,但我不确定。

任何人都可以证实吗?生命周期屏幕名称是否应始终为小写?

感谢您的咨询。

+0

我认为'companyId'通过是不正确的。 –

回答

0

在保存新用户时,Liferay总是将屏幕名称转换为小写。正如你所说,该方法在UserLocalServiceImpl.java

protected String getScreenName(String screenName) { 
    return StringUtil.lowerCase(StringUtil.trim(screenName)); 
} 

发现所以,如果你在屏幕名称创建/更新用户时通过与大写没关系,Liferay将永远改变它。