这几天在做ssm+shiro整合做单点权限登录,然而由于第一次接触,问题重重,等我做完了就整理出博客出来,现在先说遇到的问题以及解决
1.注入bean userService失败,原因其实是在Myshiro.java中的get和setter方法不对
报错信息:SSMBean property 'userService' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?
解决方法:下面这两个地方要对应,不然找不到get和set方法
![](https://img.haomeiwen.com/i14654442/0208e01d173e79f8.png)
![](https://img.haomeiwen.com/i14654442/7634c4b5de57eea6.png)
2.xml中找不到相对应的实体类
报错:org.apache.ibatis.executor.ExecutorException: No constructor found in com.hui.entity.User matching [java.lang.Integer, java.lang.String, java.lang.String]
at org.apache.ibatis.executor.resultset.DefaultResultSetHandler.createByConstructorSignature(DefaultResultSetHandler.java:656)
解决办法:实体类中加一个无参构造器就可以了
3.加密的时候登录报异常
显示错误Authentication异常,我还以为是跟数据库有关,觉得可能是数据库存的也必须是加密过的数据,然后就把盐值加密后的结果放到数据库里,然后用没加密过的登录,但是还是不行,然后我就查了一下subject.login(token)方法之后执行到哪里,有的博客居然说到doGetAuthorizationInfo,我表示怀疑,在百度发现其实是执行到 doGetAuthenticationInfo。之后再去看shiro-context.xml配置文件,原来还是配置问题导致它加载不到自定义的realm,之前为了测试shiro配置是否成功,就先把自定义的realm注释掉了。然后数据库写什么密码就登陆什么密码,加密过程我会再另一篇博客上说明。
原来:
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 注入realm -->
<!--property name="realm" ref="myShiroRealm"/>-->
</bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<!-- 注入realm -->
<property name="realm" ref="myShiroRealm"/>
</bean>
4.MyRealm中的userService要跟service层的实现类的名称要相同,不然会找不到。
![](https://img.haomeiwen.com/i14654442/8b759defc0dfbb9e.png)
@Service("userService")
public class UserServiceImpl implements UserService{
网友评论