发表于: 2018-09-17 23:41:56

4 406


今天完成的事情:

1.哭笑不得,昨天晚上添加过的web.xml中的监听器

<listener>     

<listener-class>

org.springframework.web.context.ContextLoaderListener

</listener-class>

</listener> 

通过git回溯到上传时的版本,加上这个监听器就跑通了,昨天改改改,改到后来加上这个监听器也没用。。。

幸亏建了git的仓库。

之前做的demo中web.xml没用到监听器,就给忽略了,尴尬

所以就很好奇为啥它不加都能跑通?

https://www.cnblogs.com/hackyo/p/6646051.html

上面这个就是我之前敲的demo,没有用到上下文监听器

明天计划的事情:

解决今天碰到的报错,把登录功能完成。

遇到的问题:

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'userName' not found. Available parameters are [0, 1, param1, param2]

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)

at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)

at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)

at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:835)

at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1685)

at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668)

at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)

at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)

at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)

at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)

at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)

at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)

at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)

at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)

at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)

at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)

at org.eclipse.jetty.server.Server.handle(Server.java:517)

at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)

at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)

at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)

at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)

at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)

at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)

at java.lang.Thread.run(Thread.java:748)

查询的结果:

ibatis 无效绑定异常。

我们知道 MyBatis 源自于 ibatis,在流行的 SSM 框架中,Mybatis 常被用于持久化层,说白了,就是保存数据,负责将数据持久化(插入)到数据库。在常见的 Web 项目中,我们又将其划分为 Dao 层、Service 层、Biz 层和 Facade 层,其中 Dao 层就是负责和数据库进行交互的,而交互的方式就是用 Mapper 文件进行数据库表的映射,并到 Dao 层建立与 Mapper 文件中 SQL 语句对应的函数。

现在回过头看这个异常,它发生在router.dao.RouterProviderEntityDao.query4encrypt这个地方,其中RouterProviderEntityDao表示 Dao 层,query4encrypt是 Dao 层中与 Mapper 文件对应的方法名。而且,这个异常为BindingException,绑定异常,那么很有可能就是 Mapper 文件中 SQL 的 id 名与 Dao 层中的函数名不一致。

提供几种排查方法

mapper接口和mapper.xml是否在同一个包(package)下?名字是否一样(仅后缀不同)?

比如,接口名是NameMapper.java;对应的xml就应该是NameMapper.xml

mapper.xml的命名空间(namespace)是否跟mapper接口的包名一致?

比如,你接口的包名是com.abc.dao,接口名是NameMapper.java,那么你的mapper.xml的namespace应该是com.abc.dao.NameMapper

接口的方法名,与xml中的一条sql标签的id一致

比如,接口的方法List<User> findAll();那么,对应的xml里面一定有一条是<select id="findAll" resultMap="**">****</select>

如果接口中的返回值List集合(不知道其他集合也是),那么xml里面的配置,尽量用resultMap(保证resultMap配置正确),不要用resultType

最后,如果你的项目是maven项目,请你在编译后,到接口所在目录看一看,很有可能是没有生产对应的xml文件,因为maven默认是不编译的,因此,你需要在你的pom.xml的<build></build>里面,加这么一段:

        <resources>

            <resource>

                <directory>src/main/java</directory>

                <includes>

                    <include>**/*.xml</include>

                </includes>

                <filtering>true</filtering>

            </resource>

        </resources>

检查结果:

在接口UserDao中

//查询是否存在登录账号
public int getMatchCount(String userName, String password);

改成

//查询是否存在登录账号
public int getMatchCount(@Param("userName")String userName, @Param("password")String password);

就不报该错误了。

报错内容变成了

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.apache.ibatis.binding.BindingException: Mapper method 'getMatchCount' (interface com.system.dao.UserDao) attempted to return null from a method with a primitive return type (int).

at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)

at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)

at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)

at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:835)

at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1685)

at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197)

at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1668)

at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:581)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)

at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)

at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:226)

at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1158)

at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:511)

at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185)

at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1090)

at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)

at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:213)

at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:109)

at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:119)

at org.eclipse.jetty.server.Server.handle(Server.java:517)

at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:308)

at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:242)

at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:273)

at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:95)

at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:75)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceAndRun(ExecuteProduceConsume.java:213)

at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:147)

at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:654)

at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572)

at java.lang.Thread.run(Thread.java:748)

看起来是getMatchCount方法返回了一个null,可是讲道理应该返回0或1才对啊

收获:

今天又迈过一个坎,在这之前一直觉得很难做不到,但是现在我做到了。还挺好的


返回列表 返回列表
评论

    分享到