当前位置:   article > 正文

淘淘商城第49讲——导入商品数据到索引库之表现层开发_传智播客 乐友商城,导入数据到索引库

传智播客 乐友商城,导入数据到索引库

上文我们把商品数据导入到索引库中的service层代码编写完了,本文我们将继续把商品数据导入到索引库中的表现层代码编写完,从而实现从数据库中查询出商品数据并将其导入到索引库的功能。

我们是要在表现层中调用搜索服务的导入数据功能的,但应在哪个表现层调用呢?很显然应该在后台管理系统(即taotao-manager-web工程)中调用搜索服务的导入数据功能。既然服务已经发布过了,那么我们现在只须引用服务即可,在taotao-manager-web工程中的springmvc.xml文件添加如下配置。

<dubbo:reference interface="com.taotao.search.service.SearchService" id="searchService" />
  • 1

截图如下:
在这里插入图片描述
我们知道,在默认的后台管理页面当中是没有导入数据到索引库页面的,这就需要我们自己创建这么一个管理页面了。不过首先我们得要在后台管理系统首页中添加一个导航,如下图所示,当点击一键导入索引库超链接的时候会去找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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

创建完以上页面之后,接下来我们便来编写表现层的代码,由于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();
	}
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

至此,我们的代码终于写完了,接下来我们要做的事便是启动各个工程来进行测试了。由于在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,接着依次点击ApplyRun按钮之后,就能启动该工程了。
在这里插入图片描述
有可能在启动该工程的时候,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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

添加完以上依赖之后,我们再来启动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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

是什么原因造成这个错误的呢?这是由于默认情况下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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

我就遇到了,并且解决这个异常花费了我一天半的时间,可见这有多让我不爽了,如果你也碰到了这个异常,请不要慌张,毕竟我帮你踩坑了,你可以参考我的《淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException》这篇文章来解决问题。

如果从数据库中查询出来的3097条商品数据成功导入到索引库中的话,那么你就会看到如下图所示的提示信息了。
在这里插入图片描述
然后我们再到Solr应用的首页去查看下导入的数据,发现确实能查询到,这已然说明导入商品数据到索引库的功能完美实现了。
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/788991
推荐阅读
相关标签
  

闽ICP备14008679号