Spring3+Spring-data-mongodb1.5.6示例

  • Post author:
  • Post category:其他



A: maven2 pom.xml

        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>1.5.6.RELEASE</version>
        </dependency>
        <!-- bean validate-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.3.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>el-impl</artifactId>
            <version>2.2</version>
        </dependency>

说明:

1 . 为什么Spring-data-mongodb的版本是1.5.6?

这个版本对应的Spring-data版本是1.4.6,对应的Spring-framework版本是3.2.14,大于此版本需要spring-framework 4,从这个地址可以知道:


Spring-data-parent.pom

2. 为什么还需要hibernate-validator?

缺少这个依赖会抛以下异常:

Caused by: javax.validation.ValidationException: Unable to create a Configuration, because no Bean Validation provider could be found. Add a provider like Hibernate Validator (RI) to your classpath.
    at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:271)
    at org.springframework.validation.beanvalidation.LocalValidatorFactoryBean.afterPropertiesSet(LocalValidatorFactoryBean.java:191)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1573)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1511)


B: spring的配置文件

<?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:util="http://www.springframework.org/schema/util"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
          http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
          http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
          http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
          http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
">
    <!-- 加载配置属性文件 -->
    <util:properties id="propertyConfigurer" location="classpath:spring-data-mongo.properties" />
    <context:property-placeholder ignore-unresolvable="true" properties-ref="propertyConfigurer" />

    <context:annotation-config />
    <!-- spring data -->
    <mongo:mongo host="${mongo.host}" port="${mongo.port}" />

    <mongo:db-factory dbname="${mongo.database}" mongo-ref="mongo" />

    <!-- set the mapping converter to be used by the MongoTemplate -->
    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>

    <bean class="org.springframework.data.mongodb.core.mapping.event.LoggingEventListener" />

    <bean id="forumMemberOnlineService" class="net.htage.lab.cache.mongo.ForumMemberOnlineMongo">
        <property name="mongoTemplate" ref="mongoTemplate" />
    </bean>
</beans>


C: 实体和实现类

import java.io.Serializable;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Field;
/**
 *
 * @author xiaofanku@live.cn
 * @since 20170908
 */
@Document(collection = "apo_forum_online")
public class ForumMemberOnline implements Serializable{
    @Id
    private String ID;
    @Indexed
    @Field
    private int memberId=0;
    @Indexed
    @Field
    private int uid=0;
    @Indexed
    @Field
    private String sessionId;
    @Field
    private String nickname="guest";
    //GET/SET
}
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.mongodb.core.FindAndModifyOptions;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
/**
 *
 * @author xiaofanku@live.cn
 * @since 20170908
 */
public class ForumMemberOnlineMongo implements ForumMemberOnlineService{
    private static final Logger logger=LoggerFactory.getLogger(ForumMemberOnlineMongo.class);
    private MongoTemplate mongoTemplate;

    @Override
    public ForumMemberOnline save(ForumMemberOnline entity) {
        try{
            logger.error("[OLD]session:"+entity.getSessionId());

            mongoTemplate.insert(entity);
            logger.error("[OLD]id:"+entity.getID());
            return entity;
        }catch(Exception e){
            throw new NullPointerException();
        }
    }
    //ETC
}

说明:

1. mongoTemplate.insert方法会返回@Id注解的属性

2. 无法对实体作注解,可以使用转换器

实体

/**
 *
 * @author xiaofanku@live.cn
 * @since 20170908
 */
public class ForumMemberOnline implements Serializable{
    private Long ID;
    private int memberId=0;
    private int uid=0;
    private String sessionId;
    private String nickname="guest";
    //GET/SET
}

转换器

/**
 * 
 * mongodb 出库时使用
 * @author xiaofanku@live.cn
 * @since 20170908
 */
public class ForumMemberOnlineReadConverter implements Converter<BasicDBObject, ForumMemberOnline>{
    private static final Logger logger=LoggerFactory.getLogger(ForumMemberOnlineReadConverter.class);
    @Override
    public ForumMemberOnline convert(BasicDBObject doc) {
        logger.error("converting read start");
        ForumMemberOnline fmo=new ForumMemberOnline();
        fmo.setID(doc.getLong("_id"));
        fmo.setMemberId(doc.getInt("memberId"));
        fmo.setUid(doc.getInt("uid"));
        fmo.setSessionId(doc.getString("sessionId"));
        fmo.setNickname(doc.getString("nickname"));
        return fmo;
    }

}
/**
 * mongodb 入库时转换
 * @author xiaofanku@live.cn
 * @since 20170908
 */
public class ForumMemberOnlineWriteConverter implements Converter<ForumMemberOnline, DBObject>{
    private static final Logger logger=LoggerFactory.getLogger(ForumMemberOnlineWriteConverter.class);

    @Override
    public DBObject convert(ForumMemberOnline fmo) {
        logger.error("converting write start");
        DBObject dbo = new BasicDBObject();
        if(fmo.getID()>0){
            dbo.put("_id", fmo.getID());
        }
        dbo.put("memberId", fmo.getMemberId());
        dbo.put("uid", fmo.getUid());
        dbo.put("sessionId", fmo.getSessionId());
        dbo.put("nickname", fmo.getNickname());
        return dbo;
    }
}

Spring 配置中增加

    <mongo:mapping-converter>
        <mongo:custom-converters>
            <mongo:converter>
                <bean class="package.ForumMemberOnlineReadConverter "/>
            </mongo:converter>
            <mongo:converter>
                <bean class="package.ForumMemberOnlineWriteConverter "/>
            </mongo:converter>
        </mongo:custom-converters>
    </mongo:mapping-converter>

    <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
        <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
        <constructor-arg name="mongoConverter" ref="mappingConverter"/>
    </bean>

附注:需要自已解决ID的生成, mongodb的实现参考:

Spring Data MongoDB – Auto Sequence ID example

mongodb生成的_id是一个数字和字母混合的字符序列, 也可以使用java来解决


D: 最后

[1]. 文档参考地址:

Spring Data MongoDB – Reference Documentation


[2]. 在线API:

Spring Data MongoDB 1.5.6.RELEASE API


[3]. 完整的pom.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>net.htage</groupId>
    <artifactId>lab</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>lab</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--spring framework-->
        <spring-framework.version>3.2.14.RELEASE</spring-framework.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
            <version>1.3</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-mongodb</artifactId>
            <version>1.5.6.RELEASE</version>
        </dependency>
        <!-- java unit test -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>${spring-framework.version}</version>
            <scope>test</scope>
        </dependency>
        <!-- Logging with SLF4J & Log4J -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.7.12</version>
        </dependency>
        <!-- bean validate-->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>4.3.2.Final</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.web</groupId>
            <artifactId>el-impl</artifactId>
            <version>2.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <compilerArguments>
                        <endorseddirs>${endorsed.dir}</endorseddirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <phase>validate</phase>
                        <goals>
                            <goal>copy</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${endorsed.dir}</outputDirectory>
                            <silent>true</silent>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>javax</groupId>
                                    <artifactId>javaee-endorsed-api</artifactId>
                                    <version>7.0</version>
                                    <type>jar</type>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

这里写图片描述

完整的示例下载地址:

Baidu网盘

[4]. 同时使用JPA(不是Spring-data-jpa)+Spring-data-mongodb无法同时工作

正常DEBUG:

DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class net.htage.lab.entity.ForumMemberOnline for index information.

不能工作的DEBUG:

DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.tools.schemaframework.ForeignKeyConstraint for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.tools.schemaframework.IndexDefinition for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.internal.helper.DatabaseTable for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.internal.helper.DatabaseField for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.mappings.AttributeAccessor for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.mappings.DatabaseMapping for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.mappings.querykeys.QueryKey for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class interface org.eclipse.persistence.sessions.changesets.UnitOfWorkChangeSet for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class interface org.eclipse.persistence.sessions.changesets.ObjectChangeSet for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class interface org.eclipse.persistence.sessions.changesets.ChangeRecord for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.internal.sessions.ChangeRecord for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class interface org.eclipse.persistence.exceptions.ExceptionHandler for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.exceptions.IntegrityChecker for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class class org.eclipse.persistence.sequencing.Sequence for index information.
DEBUG [org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator] - Analyzing class interface org.eclipse.persistence.mappings.converters.Converter for index information.



版权声明:本文为xiaofanku原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。