SpringMVC+MongoDB整合及注意事项

带上我自己初步整合的架构Demo供大家参考:点击下载
废话不多说
这里先带上项目的各jar包,因为版本之间的差异所爬的坑,已经数不胜数:


/ /重要的jar都圈出来了,其他包可能与本题目无关

application.properties:

#mogo
mongo.host=127.0.0.1
mongo.port=27017
mongo.connectionsPerHost=8
mongo.threadsAllowedToBlockForConnectionMultiplier=4
mongo.connectTimeout=10000
mongo.maxWaitTime=120000
mongo.autoConnectRetry=true
mongo.socketKeepAlive=true
mongo.socketTimeout=1500
mongo.slaveOk=true

这里简单解释一下各参数:
host:是对应的服务端地址(IP)
port:服务地址对应的端口
connectionsPerHost:每个host都有对应的链接数,这些链接像java的线程池,空闲时在池中,不够用时,访问就会被阻塞,等待可用。这里(听说)设置为8-10为好
threadsAllowedToBlockForConnectionMultiplier:这个参数主要是配合connectionsPerHost使用的,设置线程最大的阻塞数,为
threadsAllowedToBlockForConnectionMultiplier乘以connectionsPerHost的个数。超过之后的线程会获取到异常
connectTimeout:链接超时的毫秒数
maxWaitTime:最大等待时间,负数表示等待时间不确定
autoConnectRetry:socket读写时,不会阻止异常抛出,驱动已经有自动重建破坏链接和重试读操作. 推荐配置false
socketKeepAlive:保持socket的连接,这个看具体情况设置
socketTimeout:socket I/O读写超时时间
slaveOk: (听说)平均线程读取速度。如果设置为false时,读取线程的读取速度之间会有很多差异,可能第一条线程读了2W行数据,第二条线程1W行还不到。但是如果设置为true,每条线程之间的读取速度就会相对平均

当然还有其他参数,这里就不一一介绍了


mongodb-config.xml
<?xml version="1.0" encoding="UTF-8"?>

    <mongo:mongo-client id="mongo" replica-set="${mongo.host}:${mongo.port}">
        <mongo:client-options
            connections-per-host="${mongo.connectionsPerHost}"
            threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
            connect-timeout="${mongo.connectTimeout}"
            max-wait-time="${mongo.maxWaitTime}"
            socket-keep-alive="${mongo.socketKeepAlive}"
            heartbeat-socket-timeout="100000"
            socket-timeout="${mongo.socketTimeout}"/>
    </mongo:mongo-client>

    <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->
    <mongo:db-factory dbname="test" mongo-ref="mongo"/>

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg ref="mongo"/>
        <constructor-arg name="databaseName" value="test"/>
    </bean>

    <!-- 映射转换器,扫描back-package目录下的文件,根据注释,把它们作为mongodb的一个collection的映射 --> 
    <mongo:mapping-converter base-package="jaky.web.*.dao" />
    <!-- mongodb bean的仓库目录,会自动扫描扩展了MongoRepository接口的接口进行注入 --> 
    <mongo:repositories base-package="jaky.web.*" />
</beans>


spring:   applicationContext-init.xml
其他配置我就直接省略了,关键是要加上jackson的配置,接着引入mongodb-config.xml
。。。
<!-- 启用spring mvc 内建的Jackson支持  -->
     <!-- 设置json和response的字符编码 -->
     <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
         <property name="messageConverters">
             <list>
                 <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
                 <ref bean="stringHttpMessageConverter"/>
                 <ref bean="jsonHttpMessageConverter"/>
             </list>
         </property>
     </bean>
     <bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter">  
        <property name="supportedMediaTypes">  
            <list>  
                <value>text/plain;charset=UTF-8</value>  
            </list>  
        </property>  
    </bean>  
    <bean id="jsonHttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">  
        <property name="supportedMediaTypes">  
            <list>  
                <value>text/plain;charset=UTF-8</value>  
            </list>  
        </property>  
    </bean>

<!-- 引入mongodb -->
    <import resource="mongodb-config.xml"/>
。。。

接下来,
1. 先把自己的MongoDB服务开启
2. 开启tomcat
3. 部署访问

下面我带上关键的,也非常简单的代码:
注入mongoTemplate(具体地方你们自己看情况决定)

UserController.java


Service
//我这里用了泛型,你们自己根据实际使用

Dao



接着测试访问:


然后到mongodb客户端


完美
其他mongodb的操作,我就不一一写了,大家举一反三

PS: 好像很简单,其实真的许多坑,必须耐心才行。 如:

java.lang.NoSuchMethodError:  org.springframework.core.annotation.AnnotatedElementUtils.findMergedAnnotation(Ljava/lang/reflect/AnnotatedElement;Ljava/lang/Class;)Ljava/lang/annotation/Annotation;
    at org.springframework.data.mapping.model.BasicPersistentEntity.findAnnotation(BasicPersistentEntity.java:371)
    at org.springframework.data.mongodb.core.mapping.BasicMongoPersistentEntity.<init>(BasicMongoPersistentEntity.java:80)
    at org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:91)
    at org.springframework.data.mongodb.core.mapping.MongoMappingContext.createPersistentEntity(MongoMappingContext.java:39)
    at org.springframework.data.mapping.context.AbstractMappingContext.addPersistentEntity(AbstractMappingContext.java:309)
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:180)
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:140)
    at org.springframework.data.mapping.context.AbstractMappingContext.getPersistentEntity(AbstractMappingContext.java:67)
    at org.springframework.data.mongodb.core.MongoTemplate.getPersistentEntity(MongoTemplate.java:1996)
    at org.springframework.data.mongodb.core.MongoTemplate.save(MongoTemplate.java:959)
    at jaky.web.base.nosqlBase.NoSqlBaseDao.save(NoSqlBaseDao.java:23)
    at jaky.web.base.nosqlBase.NoSqlBaseService.save(NoSqlBaseService.java:25)
    at jaky.web.test.controller.UserController.insert(UserController.java:41)
    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:483)

出现这些问题,立刻要去指定的包下面确实是否有这个方法。
例如 这里我用的是spring-framework-4.1.5,里面的jar包spring-core-4.1.5中的源码就是没有这个方法,但是
spring-core-4.3.5中就有这个方法。所以,果断换了更新的版本,问题解决。

遇到这些静态方法找不到,第一时间去确认jar。该换就换
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值