赞
踩
上文我们把商品数据导入到索引库中的service层代码编写完了,本文我们将继续把商品数据导入到索引库中的表现层代码编写完,从而实现从数据库中查询出商品数据并将其导入到索引库的功能。
我们是要在表现层中调用搜索服务的导入数据功能的,但应在哪个表现层调用呢?很显然应该在后台管理系统(即taotao-manager-web工程)中调用搜索服务的导入数据功能。既然服务已经发布过了,那么我们现在只须引用服务即可,在taotao-manager-web工程中的springmvc.xml文件添加如下配置。
<dubbo:reference interface="com.taotao.search.service.SearchService" id="searchService" />
截图如下:
我们知道,在默认的后台管理页面当中是没有导入数据到索引库页面的,这就需要我们自己创建这么一个管理页面了。不过首先我们得要在后台管理系统首页中添加一个导航,如下图所示,当点击一键导入索引库
超链接的时候会去找indexManager.jsp这个页面。
然后我们便去新建indexManager.jsp这么一个页面,如下图所示。
为方便大家复制,现将该页面的内容贴出,如下所示。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <div> <a href="javascript:void(0)" class="easyui-linkbutton" onclick="importAll()">一键导入商品数据到索引库</a> </div> <script type="text/javascript"> // 通过Ajax发送请求 function importAll() { $.post("/index/importAll", null, function (data) { if (data.status == 200) { $.messager.alert("提示", "商品数据导入成功!"); } else { $.messager.alert("提示", "商品数据导入失败!"); } }); } </script>
创建完以上页面之后,接下来我们便来编写表现层的代码,由于taotao-manager-web工程要依赖taotao-search-interface工程,因此需要添加对该工程的依赖,如下图所示。
然后我们在taotao-manager-web工程中新建一个Controller,例如ImportAllItems.java,专门处理导入商品数据到索引库的请求,如下图所示。
为方便大家复制,现将该Controller的代码贴出,如下所示。
package com.taotao.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.taotao.common.pojo.TaotaoResult; import com.taotao.search.service.SearchService; @Controller public class ImportAllItems { @Autowired private SearchService searchService; /** * 导入所有的商品的数据到索引库当中 * @return * @throws Exception */ @RequestMapping("/index/importAll") @ResponseBody public TaotaoResult importAll() throws Exception { // 1. 引入服务 // 2. 注入服务 // 3. 调用方法 return searchService.importAllSearchItems(); } }
至此,我们的代码终于写完了,接下来我们要做的事便是启动各个工程来进行测试了。由于在taotao-common工程中新添加了一个pojo,因此taotao-common工程需要重新打包,打包方式就不说了,我都说烂了。还有taotao-search聚合工程是个新工程,也需要打包到本地maven仓库。
现在我们可以来启动各个工程了,不过在启动工程之前,我们千万记得要启动Zookeeper服务器!你可以按照这样的顺序来启动各个工程,先启动taotao-manager工程,然后再启动taotao-content工程,接着再启动taotao-search工程,由于taotao-search工程还没有配置tomcat插件启动,因此需要先配置一下,方法是在工程上右键,在其下拉列表中选中Run As
,继续再在其下拉列表中点击Maven build...
,如下图所示。
这时,你便会看到如下图所示的窗口了,然后在该窗口的Goals一栏中输入clean tomcat7:run
,接着依次点击Apply
和Run
按钮之后,就能启动该工程了。
有可能在启动该工程的时候,Eclipse控制台会报如下一个异常。
出现该异常的原因是taotao-search-service工程的pom文件中没有添加如下依赖:
<!-- MyBatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> </dependency> <!-- MyBatis与分页相关的jar包 --> <dependency> <groupId>com.github.miemiedev</groupId> <artifactId>mybatis-paginator</artifactId> </dependency> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> </dependency> <!-- MySQL数据库驱动jar包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- 连接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency>
添加完以上依赖之后,我们再来启动taotao-search工程,应该是可以成功启动的了。启动完taotao-search工程之后,我们再来启动taotao-manager-web工程,所有工程都启动成功之后,我们来看下后台管理页面,在点击一键导入索引库
超链接之后,你便可以看到一键导入索引库页面了,如下图所示。
我们点击上图中的一键导入商品数据到索引库
按钮,会看到Eclipse控制台打印出了如下所示的错误信息。
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.taotao.search.mapper.SearchItemMapper.getSerarchItemList at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:189) at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:43) at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:58) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:51) at com.sun.proxy.$Proxy34.getSerarchItemList(Unknown Source) at com.taotao.search.service.impl.SearchServiceImpl.importAllSearchItems(SearchServiceImpl.java:28) at com.alibaba.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java) at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46) at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72) at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53) at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108) at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84) at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170) at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52) at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
是什么原因造成这个错误的呢?这是由于默认情况下MyBatis所对应的Mapper.xml映射文件是不被加载的,如下图所示,我们到taotao-search-service工程的mapper目录下,发现只有SearchItemMapper.class文件而没有SearchItemMapper.xml文件,没有该文件,当然执行就不成功了。
那么如何解决这个问题呢?我们到taotao-search-service工程的pom文件中去简单配置一下即可,如下图所示,添加build配置,在<resources></resources>
标签当中需要添加两个<resource>
标签,第一个<resource>
标签只是把src/main/java目录包含进去了,这样做就会导致src/main/resources目录下的配置文件都将会被忽略掉,因此我们也需要把src/main/resources目录包含进去,这就是第二个<resource>
标签所要做的事情。
修改了taotao-search-service工程的pom文件之后,我们再来重启taotao-search工程,重启成功后,我们再到如下图所示的目录中查看下SearchItemMapper.xml文件是否已经生成了,很显然已经生成了该文件。
下面我们再次点击一键导入商品数据到索引库
按钮来将商品数据导入到索引库中,在导入的过程中,极有可能Eclipse控制台会报如下一个异常。
org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://192.168.81.133:8080/solr/core1: Server error writing document id 536563 to the index at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:665) at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:265) at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:248) at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:211) at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:177) at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:138) at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:156) at com.taotao.search.service.impl.SearchServiceImpl.importAllSearchItems(SearchServiceImpl.java:42) at com.alibaba.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java) at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46) at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72) at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53) at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108) at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84) at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170) at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52) at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
我就遇到了,并且解决这个异常花费了我一天半的时间,可见这有多让我不爽了,如果你也碰到了这个异常,请不要慌张,毕竟我帮你踩坑了,你可以参考我的《淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException》这篇文章来解决问题。
如果从数据库中查询出来的3097条商品数据成功导入到索引库中的话,那么你就会看到如下图所示的提示信息了。
然后我们再到Solr应用的首页去查看下导入的数据,发现确实能查询到,这已然说明导入商品数据到索引库的功能完美实现了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。