zoukankan      html  css  js  c++  java
  • (转)淘淘商城系列——导入商品数据到索引库

    http://blog.csdn.net/yerenyuan_pku/article/details/72902073

    上文我们把商品数据导入到索引库中的Service层代码编写完了,本文我们将再来把商品数据导入到索引库中的表现层代码编写完,从而实现从数据库中导入商品数据到索引库的功能。 
    我们是要在表现层中调用搜索服务的导入数据功能的,但应在哪个表现层调用呢?很显然应该在后台管理系统——taotao-manager-web工程中调用搜索服务的导入数据功能。既然服务已经发布过了,那么我们现在只须引用服务即可,在taotao-manager-web工程中的springmvc.xml文件添加如下配置。

    <dubbo:reference interface="com.taotao.search.service.SearchItemService" id="searchItemService" />


    我们知道,在默认的后台管理页面当中是没有导入数据到索引库页面的,这就需要我们自己创建这么一个管理页面。不过首先我们需要在后台首页添加一个导航,如下图所示,当点击”导入索引库”的时候会去找index-manager.jsp这个页面。 

    接着我们便去新建index-manager.jsp这么一个页面,如下图所示。 

    为方便大家复制,现将index-manager.jsp页面的内容贴出。

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <div>
        <a class="easyui-linkbutton" onclick="importItems()">一键导入商品数据到索引库</a>
    </div>
    <script type="text/javascript">
        function importItems() {
            $.post("/index/import",null,function(data){
                if (data.status == 200) {
                    $.messager.alert('提示','商品数据导入完成!');
                } else {
                    $.messager.alert('提示','商品数据导入失败!');
                }
            });
        }
    </script>

    写好了页面,下面我们便来写一下Controller,由于taotao-manager-web工程依赖taotao-search-interface,因此需要添加对该工程的依赖,如下图所示。 

    接下来我们在taotao-manager-web工程中新建一个IndexManagerController,专门处理导入商品数据到索引库,如下图所示。 

    为方便大家复制,现将IndexManagerController类的代码贴出。

    /**
     * 索引库维护Controller
     * <p>Title: IndexManagerController</p>
     * <p>Description: </p>
     * <p>Company: www.itcast.cn</p> 
     * @version 1.0
     */
    @Controller
    public class IndexManagerController {
    
        @Autowired
        private SearchItemService searchItemService;
    
        @RequestMapping("/index/import")
        @ResponseBody
        public TaotaoResult indexImport() throws Exception {
            TaotaoResult taotaoResult = searchItemService.importAllItemToIndex();
            return taotaoResult;
        }
    
    }

    这样,我们的代码终于写完了,接下来我们要做的便是启动各个工程了。由于在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”启动该工程。 

    启动完taotao-search工程之后,我们再启动taotao-manager-web工程,启动完之后,我们看下后台管理页面,可以看到有导入索引库页面,如下图所示。 

    我们点击上图的”一键导入商品数据到索引库”,会看到如下所示错误信息。

    org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.taotao.search.mapper.ItemMapper.getItemList
        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.$Proxy31.getItemList(Unknown Source)
        at com.taotao.search.service.impl.SearchItemServiceImpl.importAllItemToIndex(SearchItemServiceImpl.java:36)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:601)
        at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
        at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:281)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)
        at com.sun.proxy.$Proxy33.importAllItemToIndex(Unknown Source)
        at com.alibaba.dubbo.common.bytecode.Wrapper0.invokeMethod(Wrapper0.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.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
        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.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:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:722)

    是什么原因造成这个错误的呢?这是由于默认情况下mybatis所对应的mapper.xml文件是不被加载的,如下图所示,我们到taotao-search-service的mapper目录下,发现只有ItemMapper.class文件没有ItemMapper.xml文件,没有xml文件,当然执行就不成功了。 

    那么解决方法是什么呢?我们到taotao-search-service工程的pom.xml文件中去简单做下配置即可,如下图所示,添加build配置,在<resources></resources>当中需要添加两个<resource>,因为第一个<resource>只是把src/main/java目录包含进去了,这样就会导致src/main/resources目录被忽略掉了,而在我们的taotao-search-service工程中src/main/resources目录下是有很多配置文件的,它是不能忽略的,因此需要把src/main/resources目录也包含进去,这也就是第二个<resource>所要做的事情。 

    既然修改了taotao-search-service工程,我们便要重启该服务,重启后,我们再到如下图所示的目录下查看ItemMapper.xml文件是否已经生成,发现已经生成了。 

    下面我们再点击”一键导入商品数据到索引库”按钮,等待一会儿,就会看到如下图所示的提示信息,说明导入成功。 

    我们再到solr网页去查看导入的数据,发现确实查询到了,说明我们的导入功能成功了。 

     
  • 相关阅读:
    Microsoft Visual Studio 产品密钥
    ActiveReport 9手把手搭建环境及实战
    TFS 用户与组管理(转)
    FTS下载地址
    URLScan安装及配置(转)
    viewstate加密(转)
    .net 网站发布 Web.Config中的<compilation debug="true"/>
    WebDAV被启用(转)
    js字母大小写转换
    限制同一个用户在同一时间只能登陆一次(转)
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6962373.html
Copyright © 2011-2022 走看看