weixin_42493435 2021-04-01 12:36 采纳率: 0%
浏览 106

ssm框架使用了oss,mybatis整合出现空指针异常错误

server报错,项目可运行

ERROR FrameworkServlet : Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'KMeansRecommendation' defined in class path resource [spring/spring-mvc.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
    at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
    at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
    at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
    at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
    at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
    at javax.servlet.GenericServlet.init(GenericServlet.java:158)
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1122)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1077)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:971)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4868)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5177)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
    at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1728)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)
    at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
    at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
    at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
    at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
    at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
    at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
    at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
    at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
    at book.task.KMeansRecommendation.CountSale(KMeansRecommendation.java:316)
    at book.task.KMeansRecommendation.KmeansRecommend(KMeansRecommendation.java:119)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1681)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1620)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
    ... 66 more

db.properties.xml

dbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=UTF-8&useSSL=false
jdbc.username=root
jdbc.password=123456
jdbc.initialSize=10
jdbc.maxActive=100
jdbc.maxIdle=100
jdbc.minIdle=0
jdbc.maxWait=1000
jdbc.testOnBorrow=true
jdbc.validationQuery=select 1

spring-mvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task.xsd">
    <!--查找使用构造型注解所标注的类,如@Component(组件)以及子类@Service(服务),@Controller(控制器),@Repository(数据仓库)-->
    <context:component-scan base-package="book.controller"/>
    <context:component-scan base-package="book.service"/>
    <context:component-scan base-package="book.dao"/>
    <context:component-scan base-package="book.task"/>
    <!-- 开启SpringMVC注解模式 -->
    <mvc:annotation-driven/>

    <!--DefaultServletHttpRequestHandler 对于进入DispatcherServlet的URL进行筛查,如果是静态资源的请求,就将该请求转由WEB应用默认的servlet处理-->
    <mvc:default-servlet-handler/>

    <!-- 配置视图路径的前缀和后缀-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <task:annotation-driven/>
    <!--系统启动先执行一次,之后每间隔60秒执行一次-->
    <bean id="myRecommendaction" class="book.task.MyRecommendation" init-method="recommend"></bean>
    <bean id="KMeansRecommendation" class="book.task.KMeansRecommendation" init-method="KmeansRecommend"></bean>
    <task:scheduled-tasks>

        <task:scheduled ref="myRecommendaction" method="recommend" cron="*/60 * * * * ?" />
        <task:scheduled ref="KMeansRecommendation" method="KmeansRecommend" cron="*/60 * * * * ?" />

    </task:scheduled-tasks>

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize">
            <value>5242880</value>
        </property>
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>

</beans>

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--这边是关联的schema文件,当需要使用相应的标签就需要引入对应的schema文件约束,在xmlns中配置,在schemaLocation配置两个地址,注意第二个地址可以省略版本号,版本号和pom里面的定义一致-->
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd"
       default-autowire="byName">

    <!--读取数据库的配置文件,之后可以使用占位符的方式-->
    <context:property-placeholder location="classpath:db.properties"/>
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <!--初始化连接大小-->
        <property name="initialSize" value="${jdbc.initialSize}"/>
        <!--设置最大活跃连接数-->
        <property name="maxActive" value="${jdbc.maxActive}"/>
        <!--设置最大空闲连接数,一般接近最大活跃连接数,因为超过最大空闲连接数剩余的连接会自动销毁,无法起到数据库连接池的作用-->
        <property name="maxIdle" value="${jdbc.maxIdle}"/>
        <!--设置最小空闲连接数-->
        <property name="minIdle" value="${jdbc.minIdle}"/>
        <!--设置最大超时时间-->
        <property name="maxWait" value="${jdbc.maxWait}"/>
        <!--解决mysql8小时问题-->
        <property name="testOnBorrow" value="${jdbc.testOnBorrow}"/>
        <property name="validationQuery" value="${jdbc.validationQuery}"/>
        <!--<property name="idleConnectionTestPeriod" value="${jdbc.dleConnectionTestPeriod}"/>
        <property name="maxIdleTime" value="1800" />-->
    </bean>
    <!-- spring和MyBatis整合,可以省略mybatis的配置映射文件 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--设置数据源,这里使用dbcp的数据库连接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--这里设置mybatis数据源配置(不是必须的,先留着吧)-->
        <property name="configLocation" value="classpath:mybatis/configuration.xml"/>
        <!-- 自动扫描mapping.xml映射文件-->
         <property name="mapperLocations" value="classpath:mybatis/sqlMap/*.xml"/>
    </bean>
    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!--配置事务模板,之后可以使用编程式事务方式-->
    <bean id="transactionTemplate"
          class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"/>
    </bean>
    <!--默认线程池-->
    <bean id="defaultEventHandlerExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="5"/>
        <property name="maxPoolSize" value="20"/>
        <property name="queueCapacity" value="50"/>
    </bean>

    <bean id="ossClient" class="book.task.OSS">
        <constructor-arg name="endPoint" value="oss-cn-beijing.aliyuncs.com"></constructor-arg>
        <constructor-arg name="accessKeyId" value="LTAI5tSWZKrjuPgyQ7fCY94A"></constructor-arg>
        <constructor-arg name="accessKeySecret" value="nBTMnLtXjqsBTAvNUpR8sLOBU0QThm"></constructor-arg>
        <constructor-arg name="bucketName" value="book-recommendation-photo1"></constructor-arg>
    </bean>

</beans>

KMeansRecommendation代码

package book.task;

import book.dao.BookDao;
import book.dao.BorrowDao;
import book.dao.RecommendDao;
import book.dao.UserDao;
import book.domain.dataobject.*;
import book.domain.exception.BusinessException;
import book.util.LoggerUtil;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.CollectionUtils;

import javax.annotation.Resource;
import java.util.*;

import static com.google.common.collect.Lists.newArrayList;

/**
 * @author hui zhang
 * @date 2018-4-25
 */
@Component
public class KMeansRecommendation {
    private static final Logger LOGGER = LoggerFactory.getLogger(KMeansRecommendation.class);

    @Resource(name = "bookDao")
    private BookDao bookDao;

    @Resource(name = "userDao")
    private UserDao userDao;

    @Resource(name = "borrowDao")
    private BorrowDao borrowDao;

    @Resource(name = "recommendDao")
    private RecommendDao recommendDao;

    @Resource(name = "transactionTemplate")
    private TransactionTemplate transactionTemplate;

    private List<String> professionList;

    /*
    1、用户注册时要求填写年龄,性别,职业;
    2、首先计算各个职业之间的相似度P:将看过这本书且职业相同的人的评分求平均值,作为这个职业
    (相当于一个用户,有多少个职业类别就有多少个用户)对这本书的评分,然后根据皮尔孙系数求相似度;
    3、年龄之间的相似度A:7岁产生代沟的可能性较大,B(u,v)=7/(|Bu-Bv|),当|Bu-Bv|>7时;当|Bu-Bv|≤7时,B(u,v)=1;
    4、性别相似度F:相同为0,不相同为1;
    5、两个用户之间的距离即为A+F-P;
    */

    public void KmeansRecommend()
    {
        LoggerUtil.info(LOGGER,"enter in KmeansRecommend");
        recommendDao.deleteBefore(1);
        InitProfession();
        //待分类的原始值
        List<UserDO> userDOList=userDao.listAllUsers();
        //将要分成的类别数
        int k=(int)Math.sqrt(userDOList.size());
        //定义最大迭代次数
        int maxClusterTimes=500;
        //迭代次数
        int count=1;
        //聚类的结果
        List<List<UserDO>> clusterList=Lists.newArrayListWithCapacity(k);
        for (int i=0;i<k;i++){
            clusterList.add(Lists.newArrayList());
        }
        //质心
        List<UserDO> clusterCenteringList=Lists.newArrayList();
        //随机选择初始的质心
        Collections.shuffle(userDOList);
        for(int i=0;i<k;i++)
            clusterCenteringList.add(userDOList.get(i));
        //计算每个用户最靠近哪个质心,并将其加入相应的类中
        boolean Change=true;
        while(Change&&count<=maxClusterTimes) {
            Change=false;
            for (int i = 0; i < userDOList.size(); i++) {
                //定义一个最小堆,存放用户到质心的距离
                PriorityQueue<Map.Entry<Integer, Double>> priorityQueue = new PriorityQueue<Map.Entry<Integer, Double>>(new Comparator<Map.Entry<Integer, Double>>() {
                    @Override
                    public int compare(Map.Entry<Integer, Double> o1, Map.Entry<Integer, Double> o2) {
                        return (int) (o1.getValue() - o2.getValue());
                    }
                });
                Map<Integer, Double> map = Maps.newHashMap();
                for (int j = 0; j < k&&j<clusterCenteringList.size(); j++) {
                    double distance = CalDistance(userDOList.get(i), clusterCenteringList.get(j));
                    map.put(j, distance);
                }
                priorityQueue.addAll(map.entrySet());
                //从堆顶获得最短距离对应的质心下标,将用户加到对应的质心的那一类中
                clusterList.get(priorityQueue.poll().getKey()).add(userDOList.get(i));
            }
            System.out.println(count);
            List<UserDO> newCenterList = CenterUpdate(clusterList);
            if(isChange(clusterCenteringList,newCenterList))
            {
                Change=true;
                clusterCenteringList=newCenterList;
            }
            count++;
            System.out.println(count);
        }
        System.out.println(clusterList);
        //销量的最大堆
        Queue<Map.Entry<String,Integer>> priorityQueue=new PriorityQueue<>((a,b)->(b.getValue().compareTo(a.getValue())));
        Map<String, Integer> bookCountMap=CountSale();
        priorityQueue.addAll(bookCountMap.entrySet());
        //遍历每一个用户,找出他属于哪一类
        //对于这一类中其他用户看过的书,求并集去重
        //然后这些书和他看过的书求差集,存放在最小堆里面
        for(UserDO userDO:userDOList)
        {
            //推荐书籍的数量
            int recommendCount=0;
            priorityQueue.clear();
            //兜底,每次都重新计算借阅量最大堆,防止为这个用户推荐的图书不够三本
            priorityQueue.addAll(bookCountMap.entrySet());
            //记录用户所在类的下标
            int ClusterIndex=0;
            //扫描每一个类
            for(int i=0;i<clusterList.size();i++)
            {
                //扫描这一类中的用户
                for(int j=0;j<clusterList.get(i).size();j++)
                {
                    if(userDO.getUserId()==clusterList.get(i).get(j).getUserId()) {
                        ClusterIndex=i;
                        break;
                    }
                }
            }
            //存放其他其他用户看过的书:bookName-author集合
            Set<String> bookSet=Sets.newHashSet();
            //该用户自己已经看过的书
            Set<String> MyBookSet=Sets.newHashSet();
            for(UserDO userDO1:clusterList.get(ClusterIndex))
            {
                //计算和该用户同一类的其他用户看过的书籍
                if(userDO.getUserId()!=userDO1.getUserId())
                {
                    List<BorrowDO> borrowDOList=borrowDao.listByUserId(userDO1.getUserId());
                    for(BorrowDO borrowDO:borrowDOList)
                    {
                      BookDO bookDO=bookDao.queryBookByBookId(borrowDO.getBookId());
                      bookSet.add(Joiner.on("-").skipNulls().join(bookDO.getBookName(),bookDO.getAuthor()));
                    }
                }
                //计算本人已经看过的书籍
                else
                {
                    List<BorrowDO> borrowDOList=borrowDao.listByUserId(userDO.getUserId());
                    for(BorrowDO borrowDO:borrowDOList)
                    {
                        BookDO bookDO=bookDao.queryBookByBookId(borrowDO.getBookId());
                        MyBookSet.add(Joiner.on("-").skipNulls().join(bookDO.getBookName(),bookDO.getAuthor()));
                    }
                }
            }
            //求出bookSet中有的而MyBookSet中没有的书
            bookSet=Sets.difference(bookSet,MyBookSet);
            List<BookDO> bookDOList=Lists.newArrayList();
            for(String bookAuthor:bookSet)
            {
                //分离出书名和作者
                Iterator<String> iterator = Splitter.on("-").split(bookAuthor).iterator();
                List<String> stringList = Lists.newArrayList();
                while (iterator.hasNext()) {
                    stringList.add(iterator.next());
                }
                //根据书名和作者名查询这本书
                List<BookDO> bookDOList1=bookDao.listBooksByAuthorAndName(stringList.get(0),stringList.get(1));
                //若这本书有很多本,只加入第一本书
                bookDOList.add(bookDOList1.get(0));
            }
            List<String>recommendList=Lists.newArrayList();
            while (recommendCount<bookDOList.size()&& recommendCount< 3) {
               BookDO bookDO=bookDOList.get(recommendCount);
                AddToDataBase(bookDO.getBookName(), bookDO.getAuthor(), userDO.getUserId());
                recommendList.add(Joiner.on("-").skipNulls().join(bookDO.getBookName(),bookDO.getAuthor()));
                recommendCount++;
            }
            //不够的从销量最大堆中取
            while (recommendCount<3&&!priorityQueue.isEmpty()) {
                //获取堆顶元素
                Map.Entry<String, Integer> entry = priorityQueue.poll();
                String max= entry.getKey();
                //分离出
                Iterator<String> iterator = Splitter.on("-").split(max).iterator();
                List<String> stringList = Lists.newArrayList();
                while (iterator.hasNext()) {
                    stringList.add(iterator.next());
                }
                //如果这本书已经在推荐列表中,则跳过
                if (recommendList.contains(Joiner.on("-").skipNulls().join(stringList.get(0),stringList.get(1)))){
                    continue;
                }
                recommendList.add(Joiner.on("-").skipNulls().join(stringList.get(0),stringList.get(1)));
                AddToDataBase(stringList.get(0), stringList.get(1), userDO.getUserId());
                recommendCount++;
            }
        }
    }

    /**
     * 添加到数据库
     * @param bookName
     * @param author
     * @param userId
     */
    public void AddToDataBase(String bookName, String author, long userId) {
        RecommendationDO recommendationDO = new RecommendationDO();
        recommendationDO.setUserId(userId);
        recommendationDO.setBookName(bookName);
        recommendationDO.setAuthor(author);
        recommendationDO.setRecommendType(1);
        recommendDao.addRecommendation(recommendationDO);
    }

    /**
     * 判断质心是否还在变化,若还在变化则返回true
     * @param oldCenterList
     * @param newCenterList
     * @return
     */
    public boolean isChange(List<UserDO> oldCenterList,List<UserDO> newCenterList)
    {
        for(UserDO userDO:oldCenterList)
            for(UserDO userDO1:newCenterList)
            {
                   if(!userDO.equals(userDO1))
                       return true;
            }
            return false;
    }

    /**
     * 更新质心,返回质心列表
     * @param clusterList
     * @return
     */
    public List<UserDO> CenterUpdate( List<List<UserDO>> clusterList) {
        List<UserDO> updateCenterList=Lists.newArrayList();
        UserDO user=new UserDO();
        for (List<UserDO> centerList : clusterList) {
            if (CollectionUtils.isEmpty(centerList)){
                continue;
            }
            int age = 0, sex = 0;
            String profession = null;
            Map<String, Integer> map = Maps.newHashMap();
            for (UserDO userDO : centerList) {
                age += userDO.getAge();
                sex += userDO.getSex();
                if (map.get(userDO.getProfession())==null)
                    map.put(userDO.getProfession(), 1);
                else
                    map.put(userDO.getProfession(), map.get(userDO.getProfession()) + 1);
            }
            int count = 0;
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                if (entry.getValue() > count) {
                    profession = entry.getKey();
                    count = entry.getValue();
                }
            }
            age=age/centerList.size();
            sex=sex/centerList.size();
            user.setSex(sex);
            user.setAge(age);
            user.setProfession(profession);
            updateCenterList.add(user);
        }
        return updateCenterList;
    }
    /**
     * 计算两个用户之间的距离
     * @param userDOA
     * @param userDOB
     * @return
     */
    public double CalDistance(UserDO userDOA,UserDO userDOB)
    {
        //职业相似度矩阵
        Map<Map<String,String>,Double> SimilarityMap=CalProfessionSimlarity();
        Map<String,String>map=Maps.newHashMap();
        map.put(userDOA.getProfession(),userDOB.getProfession());
        double professionRate=SimilarityMap.get(map);
        double sexRate=userDOA.getSex().equals(userDOB.getSex())?1:0;
        double ageRate=Math.abs(userDOA.getAge()-userDOB.getAge())>7?((double)7/Math.abs(userDOA.getAge()-userDOB.getAge())):1;
        return -ageRate-sexRate-professionRate;
    }

    /**
     * 获得每本书的销量
     * @return
     */
    public Map<String,Integer> CountSale()
    {
        Map<String, Integer> bookCountMap = Maps.newHashMap();
        List<BorrowDO> borrowDOList=borrowDao.listAllBorrows();
        for(BorrowDO borrowDO:borrowDOList) {
            BookDO bookDO=bookDao.queryBookByBookId(borrowDO.getBookId());
            String key = Joiner.on("-").skipNulls().join(bookDO.getBookName(), bookDO.getAuthor());
            if(bookCountMap.get(key)==null)
            {
                bookCountMap.put(key,1);
            }
            else
            {
                int count = bookCountMap.get(key);
                bookCountMap.put(key, count + 1);
            }
        }
        return bookCountMap;
    }
    /**
     * 进行数据清洗,bookName-author相同为一本书,
     * 一个用户多次看过这本书只取最后一次借阅记录,评分也取最后一次的
     * @return
     */
    public List<RecommendDO> DataHandle()
    {
        LoggerUtil.info(LOGGER, "enter in DataHandle");
        List<UserDO> userDOList = userDao.listAllUsers();
        List<BookDO> bookDOList = bookDao.listAllBooks();
        List<BorrowDO> borrowDOList = borrowDao.listAllBorrows();
        List<RecommendDO> recommendDOList = Lists.newArrayList();

        //记录每一本书被看过的次数
        Map<String, Integer> bookCountMap = Maps.newHashMap();

        //记录某一个人是否看过某一本书,如果看过则分数使用最近的评分.
        //同时还记录上一次修改的位置
        Map<String,Integer> hasSeenTheBook=Maps.newHashMap();
        for (BorrowDO borrowDO : borrowDOList) {
            BookDO bookDO = bookDao.queryBookByBookId(borrowDO.getBookId());
            UserDO userDO = userDao.queryByUserId(borrowDO.getUserId());
            //不通过校验
            if (bookDO == null || userDO == null) {
                continue;
            }
            //书名和作者都一样认为是同一本书,拼接成“bookName-author”
            String key = Joiner.on("-").skipNulls().join(bookDO.getBookName(), bookDO.getAuthor());
            if (bookCountMap.get(key) == null) {
                //这本书第一次被读
                bookCountMap.put(key, 1);
                //读者看过某本书,拼接为“userId-bookName-author”,并且记下这条记录的下标
                hasSeenTheBook.put(Joiner.on("-").skipNulls().join(userDO.getUserId(),key),recommendDOList.size());
            } else {
                //不是第一次看这本书
                int count = bookCountMap.get(key);
                bookCountMap.put(key, count + 1);
                //多次评论同一个书籍使用最后一次评分为准
                if (hasSeenTheBook.get(Joiner.on("-").skipNulls().join(userDO.getUserId(),key))!=null) {
                    int index=hasSeenTheBook.get(Joiner.on("-").skipNulls().join(userDO.getUserId(),key));
                    recommendDOList.get(index).setRate(borrowDO.getGoal());
                }
            }
            RecommendDO recommendDO = new RecommendDO();
            recommendDO.setUserId(borrowDO.getUserId());
            recommendDO.setAge(userDao.queryByUserId(borrowDO.getUserId()).getAge());
            recommendDO.setSex(userDao.queryByUserId(borrowDO.getUserId()).getSex());
            recommendDO.setProfession(userDao.queryByUserId(borrowDO.getUserId()).getProfession());
            recommendDO.setBookId(key);
            recommendDO.setRate(borrowDO.getGoal());
            recommendDOList.add(recommendDO);
        }
        return recommendDOList;
    }
    /**
     * 返回职业相似度的矩阵
     * @return
     */
    public Map<Map<String, String>, Double> CalProfessionSimlarity() {
        List<RecommendDO> recommendDOList=DataHandle();
        List<BookDO> bookDOList = bookDao.listAllBooks();
        Map<Map<String, String>, Double> SimilarityMap = Maps.newHashMap();
        for (int i=0;i<professionList.size();i++){
            Map<String, String> map = Maps.newHashMap();
            map.put(professionList.get(i),professionList.get(i));
            SimilarityMap.put(map,1.0);
        }
        for (int i = 0; i < professionList.size(); i++)
            for (int j = i + 1; j < professionList.size(); j++) {
                //存放两个不同职业对每本书的评分
                Map<String, Double> mapA = Maps.newHashMap();
                Map<String, Double> mapB = Maps.newHashMap();
                //记录是存的哪两个职业
                Map<String, String> map = Maps.newHashMap();
                for (int k = 0; k < bookDOList.size(); k++) {
                    //书-评分
                    double sumA = 0, sumB = 0;
                    double totalA = 0, totalB = 0;
                    for (int l = 0; l <recommendDOList.size(); l++) {
                        String bookName = recommendDOList.get(l).getBookId().substring(0, recommendDOList.get(l).getBookId().indexOf("-"));
                        if ((StringUtils.equals(bookDOList.get(k).getBookName(), bookName)) && (StringUtils.equals(recommendDOList.get(l).getProfession(), (professionList.get(i))))) {
                            sumA += recommendDOList.get(l).getRate();
                            totalA++;
                        } else if ((StringUtils.equals(bookName, (bookDOList.get(k).getBookName()))) && (StringUtils.equals(recommendDOList.get(l).getProfession(), professionList.get(j)))) {
                            sumB += recommendDOList.get(l).getRate();
                            totalB++;
                        }
                    }
                    if (totalA != 0){
                        mapA.put(bookDOList.get(k).getBookName(), sumA / totalA);
                    }
                    if (totalB != 0){
                        mapB.put(bookDOList.get(k).getBookName(), sumB / totalB);
                    }
                }
                //计算这两个职业的相似度
                //1、求看过的书的交集
                Set<String> bookSet = Sets.intersection(mapA.keySet(), mapB.keySet());
                if (bookSet.size() == 0) {
                   // throw new BusinessException("没有看过相同的书籍");
                    map=Maps.newHashMap();
                    map.put(professionList.get(j),professionList.get(i));
                    SimilarityMap.put(map,0.0);
                    map=Maps.newHashMap();
                    map.put(professionList.get(i),professionList.get(j));
                    SimilarityMap.put(map,0.0);
                    continue;
                }
                System.out.println("bookSet:" + bookSet);
                //计算ab的平均值
                Iterator<String> iterator = bookSet.iterator();
                double averageA = 0;
                double averageB = 0;
                while (iterator.hasNext()) {
                    String bookName = iterator.next();
                    averageA = averageA + mapA.get(bookName);
                    averageB = averageB + mapB.get(bookName);
                }
                averageA = averageA / bookSet.size();
                averageB = averageB / bookSet.size();
                System.out.println("averageA:" + averageA + "averageB:" + averageB);
                iterator = bookSet.iterator();
                double molecule = 0;
                //求分子
                while (iterator.hasNext()) {
                    String bookName = iterator.next();
                    molecule = molecule + (mapA.get(bookName) - averageA) * (mapB.get(bookName) - averageB);
                }
                //求分母denominator
                double denominatorLeft = 0;
                iterator = bookSet.iterator();
                while (iterator.hasNext()) {
                    String bookName = iterator.next();
                    denominatorLeft = denominatorLeft + (mapA.get(bookName) - averageA) * (mapA.get(bookName) - averageA);
                }
                double denominatorRight = 0;
                iterator = bookSet.iterator();
                while (iterator.hasNext()) {
                    String bookName = iterator.next();
                    denominatorRight = denominatorRight + (mapB.get(bookName) - averageB) * (mapB.get(bookName) - averageB);
                }
                map.put(professionList.get(i), professionList.get(j));
                Map<String,String>map2=Maps.newHashMap();
                map2.put(professionList.get(j),professionList.get(i));
                SimilarityMap.put(map2,molecule / Math.sqrt(denominatorLeft * denominatorRight));
                System.out.println("molecule:" + molecule);
                SimilarityMap.put(map, molecule / Math.sqrt(denominatorLeft * denominatorRight));
            }
            System.out.print(SimilarityMap);
            return SimilarityMap;
    }

    public void InitProfession() {
        professionList=Lists.newArrayList();
        professionList.add(0, "IT");
        professionList.add(1, "医生");
        professionList.add(2, "老师");
    }

}

jar包

tomcat本地日志报错

01-Apr-2021 11:53:32.478 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.ApplicationContext.log Servlet.init() for servlet [springMvc] threw exception
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'KMeansRecommendation' defined in class path resource [spring/spring-mvc.xml]: Invocation of init method failed; nested exception is java.lang.NullPointerException
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
        at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
        at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
        at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
        at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
        at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
        at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
        at javax.servlet.GenericServlet.init(GenericServlet.java:158)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1122)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1077)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:971)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4868)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5177)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1728)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)
        at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
        at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
        at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
        at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
        at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
        at sun.rmi.transport.Transport$1.run(Transport.java:200)
        at sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)
    Caused by: java.lang.NullPointerException
        at book.task.KMeansRecommendation.CountSale(KMeansRecommendation.java:316)
        at book.task.KMeansRecommendation.KmeansRecommend(KMeansRecommendation.java:119)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1681)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1620)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
        ... 66 more
01-Apr-2021 11:53:32.478 严重 [RMI TCP Connection(3)-127.0.0.1] org.apache.catalina.core.StandardContext.loadOnStartup Servlet [springMvc] in web application [/fengsigaoju_springMvc_book_war_exploded] threw load() exception
    java.lang.NullPointerException
        at book.task.KMeansRecommendation.CountSale(KMeansRecommendation.java:316)
        at book.task.KMeansRecommendation.KmeansRecommend(KMeansRecommendation.java:119)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1681)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1620)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:703)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:760)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
        at org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:658)
        at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:624)
        at org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:672)
        at org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:543)
        at org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:484)
        at org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
        at javax.servlet.GenericServlet.init(GenericServlet.java:158)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1122)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1077)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:971)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4868)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5177)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
        at org.apache.catalina.startup.HostConfig.manageApp(HostConfig.java:1728)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:457)
        at org.apache.catalina.mbeans.MBeanFactory.createStandardContext(MBeanFactory.java:406)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:289)
        at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
        at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
        at com.sun.jmx.remote.security.MBeanServerAccessController.invoke(MBeanServerAccessController.java:468)
        at javax.management.remote.rmi.RMIConnectionImpl.doOperation(RMIConnectionImpl.java:1468)
        at javax.management.remote.rmi.RMIConnectionImpl.access$300(RMIConnectionImpl.java:76)
        at javax.management.remote.rmi.RMIConnectionImpl$PrivilegedOperation.run(RMIConnectionImpl.java:1309)
        at java.security.AccessController.doPrivileged(Native Method)
        at javax.management.remote.rmi.RMIConnectionImpl.doPrivilegedOperation(RMIConnectionImpl.java:1408)
        at javax.management.remote.rmi.RMIConnectionImpl.invoke(RMIConnectionImpl.java:829)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:346)
        at sun.rmi.transport.Transport$1.run(Transport.java:200)
        at sun.rmi.transport.Transport$1.run(Transport.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
        at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:683)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:748)

 

  • 写回答

4条回答 默认 最新

  • codebank开发者 2021-04-01 14:37
    关注

    初始化时候空指针异常,检查配置

    评论

报告相同问题?

悬赏问题

  • ¥50 mac mini外接显示器 画质字体模糊
  • ¥15 TLS1.2协议通信解密
  • ¥40 图书信息管理系统程序编写
  • ¥20 Qcustomplot缩小曲线形状问题
  • ¥15 企业资源规划ERP沙盘模拟
  • ¥15 树莓派控制机械臂传输命令报错,显示摄像头不存在
  • ¥15 前端echarts坐标轴问题
  • ¥15 ad5933的I2C
  • ¥15 请问RTX4060的笔记本电脑可以训练yolov5模型吗?
  • ¥15 数学建模求思路及代码