WEBぷろぐらま~ システム開発エトセトラ

WEBぷろぐらま~ システム開発エトセトラ

システム開発周りの情報をシェアできれば!!

Amebaでブログを始めよう!
MongoDB(Morphia) + Spring 連携で実装と設定のサンプル

MongoDBにORマッパー(Morphia)を使ってみた実装例と設定です。
参考にしたのはほとんどマニュアルページとstackoverflowです。

やりたかったことは、WEBサーバからログをMongoDBに集めて、管理ツールからログを確認です。
ログの収集は、Fluentdです。あれは便利です。その話はまた後で・・・

Mavenの設定
下記を追加
        <!-- mongodb -->
        <dependency>
            <groupId>org.mongodb</groupId>
            <artifactId>mongo-java-driver</artifactId>
            <version>2.11.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.code.morphia</groupId>
            <artifactId>morphia</artifactId>
            <version>0.99</version>
        </dependency>


Spring設定
    <!-- mongo -->
    <bean id="mongo" class="com.mongodb.Mongo">
        <constructor-arg value="localhost" type="java.lang.String"/>
        <constructor-arg value="27017" type="int"/>
    </bean>

    <!-- ORマッパー -->
    <bean id="morphia" class="com.google.code.morphia.Morphia"/>

    <bean id="datastore" factory-bean="morphia" factory-method="createDatastore">
        <constructor-arg ref="mongo"/>
        <constructor-arg value="dbName"/>
    </bean>
    
    <!-- DAO定義 -->
    <bean id="myDao" class="myDaoImpl"/>

各自の環境に合わせる。

※ハマったポイント
mongoクラスには引数の異なるコンストラクタが定義されています。type="java.lang.String" type="int"が無いと意図しないコンストラクタが選択されます。




Dto定義
@Entity(value = "applog")
public class Applog implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    private ObjectId id;
    private String userId;
    private String message;
    private Date time;


    public ObjectId getId() {
        return id;
    }
    public void setId(ObjectId id) {
        this.id = id;
    }
    public String getUserId() {
        return userId;
    }
    public void setUserId(String userId) {
        this.userId = userId;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public Date getTime() {
        return time;
    }
    public void setTime(Date time) {
        this.time = time;
    }
}


DAO定義
@Repository
public class MyDaoImpl extends BasicDAO<Applog, ObjectId> implements MyDao{

    // 引数をDI
    @Autowired
    public MyDaoImpl(Datastore ds) {
        super(Applog.class, ds);
    }


    @Override
    public List<Applog> findByUserId(String userId){
        return ds.find(entityClazz).field("userId").equal(userId).order("time").asList();
    }
}

BasicDAOで基本のクエリは定義してあります。
複雑な検索条件を指定する場合は下記を参考
https://code.google.com/p/morphia/wiki/Query