Java-MongoDB将带破折号(Message Id)的对象键映射到点(Message.Id)。Spring数据MongoDB

Java-MongoDB将带破折号(Message Id)的对象键映射到点(Message.Id)。Spring数据MongoDB,java,spring,mongodb,spring-mvc,Java,Spring,Mongodb,Spring Mvc,我在将文档中的MongoDB对象映射到Java哈希映射时遇到了一个奇怪的问题 如果我像这样用HashMap(“Message Id”=>“something”)将一个对象存储到某个集合中,并再次从数据库中获取它,那么结果对象将具有HashMap(“Message.Id”=>“something”) 我在Spring引导应用程序中使用Spring数据MongoDB 单元测试: package com.mailor.app.data.mapping.bugs; import static org.

我在将文档中的MongoDB对象映射到Java哈希映射时遇到了一个奇怪的问题

如果我像这样用
HashMap
(“Message Id”=>“something”)将一个对象存储到某个集合中,并再次从数据库中获取它,那么结果对象将具有
HashMap
(“Message.Id”=>“something”)

我在Spring引导应用程序中使用Spring数据MongoDB

单元测试:

package com.mailor.app.data.mapping.bugs;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;

import java.util.HashMap;
import java.util.Optional;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.google.common.collect.Maps;
import com.mailor.app.data.DataConfig;
import com.mailor.app.data.TestDataConfig;
import com.mailor.app.data.constants.HeaderParams;
import com.mailor.app.data.mapping.entity.MessageIdTestEntity;

/**
 * @author jakob
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { DataConfig.class, TestDataConfig.class })
public class MessageIdDotDashTest {

    @Autowired
    private MongoTemplate template;

    @Test
    public void messageIdDotOrDashTest() {
        //HeaderParams.MESSAGE_ID = Message-Id
        dotOrDashInKeyTest(HeaderParams.MESSAGE_ID);
    }

    @Test
    public void contentTypeDotOrDashTest() {
        dotOrDashInKeyTest("Content-Type");
    }

    @Test
    public void somethingDotOrDashTest() {
        dotOrDashInKeyTest("Something-with-dashes");
    }

    @Test
    public void hashMapSetOnKeyWithDashTest() {
        HashMap<String, String> testMap = Maps.newHashMap();
        testMap.put(HeaderParams.MESSAGE_ID, "something");
        assertEquals("something", testMap.get(HeaderParams.MESSAGE_ID));
    }

    private void dotOrDashInKeyTest(String key) {
        String messageId = "some kind of message id";
        MessageIdTestEntity testEntity = new MessageIdTestEntity();
        testEntity.getHeaders().put(key, messageId);
        template.save(testEntity);

        Optional<MessageIdTestEntity> testEntityFromDB = Optional.ofNullable(template.findOne(query(where("code").is(testEntity.getCode())), MessageIdTestEntity.class));
        assertTrue(testEntityFromDB.isPresent());
        assertNotNull(testEntityFromDB.get().getHeaders().get(key)); // THIS FAILING, header key is Message.Id not Message-Id
        assertEquals(messageId, testEntityFromDB.get().getHeaders().get(key));
    }
}
package com.mailor.app.data.mapping.entity;

import java.util.HashMap;
import java.util.UUID;

import com.google.common.collect.Maps;

/**
 * @author jakob
 *
 */
public class MessageIdTestEntity {

    private String code = UUID.randomUUID().toString();

    private HashMap<String, String> headers = Maps.newHashMap();

    /**
     * @return the code
     */
    public String getCode() {
        return code;
    }

    /**
     * @return the headers
     */
    public HashMap<String, String> getHeaders() {
        return headers;
    }

    /**
     * @param headers
     *            the headers to set
     */
    public void setHeaders(HashMap<String, String> headers) {
        this.headers = headers;
    }

}
package com.mailor.app.data.mapping.bug;
导入静态org.junit.Assert.assertEquals;
导入静态org.junit.Assert.assertNotNull;
导入静态org.junit.Assert.assertTrue;
导入静态org.springframework.data.mongodb.core.query.Criteria.where;
导入静态org.springframework.data.mongodb.core.query.query.query;
导入java.util.HashMap;
导入java.util.Optional;
导入org.junit.Test;
导入org.junit.runner.RunWith;
导入org.springframework.beans.factory.annotation.Autowired;
导入org.springframework.data.mongodb.core.MongoTemplate;
导入org.springframework.test.context.ContextConfiguration;
导入org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
导入com.google.common.collect.Maps;
导入com.mailor.app.data.DataConfig;
导入com.mailor.app.data.TestDataConfig;
导入com.mailor.app.data.constants.HeaderParams;
导入com.mailor.app.data.mapping.entity.MessageIdTestEntity;
/**
*@作者雅各布
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(类={DataConfig.class,TestDataConfig.class})
公共类MessageIdDotDashTest{
@自动连线
私有MongoTemplate模板;
@试验
public void messageIdDotOrDashTest(){
//HeaderParams.MESSAGE_ID=消息ID
dotOrDashInKeyTest(HeaderParams.MESSAGE_ID);
}
@试验
public void contentTypeDotOrDashTest(){
dotOrDashInKeyTest(“内容类型”);
}
@试验
public void something dotordashtest()的{
dotOrDashInKeyTest(“带破折号的东西”);
}
@试验
public void hashMapSetOnKeyWithDashTest(){
HashMap testMap=Maps.newHashMap();
testMap.put(HeaderParams.MESSAGE_ID,“something”);
assertEquals(“something”,testMap.get(HeaderParams.MESSAGE_ID));
}
私有void dotOrDashInKeyTest(字符串键){
String messageId=“某种消息id”;
MessageIdTestEntity testEntity=新MessageIdTestEntity();
testEntity.getHeaders().put(key,messageId);
模板保存(testEntity);
可选testEntityFromDB=Optional.ofNullable(template.findOne(查询(其中(“代码”).is(testEntity.getCode()),MessageIdTestEntity.class));
assertTrue(testEntityFromDB.isPresent());
assertNotNull(testEntityFromDB.get().getHeaders().get(key));//如果失败,标头键是Message.Id而不是Message Id
assertEquals(messageId,testEntityFromDB.get().getHeaders().get(key));
}
}
测试对象:

package com.mailor.app.data.mapping.bugs;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;

import java.util.HashMap;
import java.util.Optional;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.google.common.collect.Maps;
import com.mailor.app.data.DataConfig;
import com.mailor.app.data.TestDataConfig;
import com.mailor.app.data.constants.HeaderParams;
import com.mailor.app.data.mapping.entity.MessageIdTestEntity;

/**
 * @author jakob
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { DataConfig.class, TestDataConfig.class })
public class MessageIdDotDashTest {

    @Autowired
    private MongoTemplate template;

    @Test
    public void messageIdDotOrDashTest() {
        //HeaderParams.MESSAGE_ID = Message-Id
        dotOrDashInKeyTest(HeaderParams.MESSAGE_ID);
    }

    @Test
    public void contentTypeDotOrDashTest() {
        dotOrDashInKeyTest("Content-Type");
    }

    @Test
    public void somethingDotOrDashTest() {
        dotOrDashInKeyTest("Something-with-dashes");
    }

    @Test
    public void hashMapSetOnKeyWithDashTest() {
        HashMap<String, String> testMap = Maps.newHashMap();
        testMap.put(HeaderParams.MESSAGE_ID, "something");
        assertEquals("something", testMap.get(HeaderParams.MESSAGE_ID));
    }

    private void dotOrDashInKeyTest(String key) {
        String messageId = "some kind of message id";
        MessageIdTestEntity testEntity = new MessageIdTestEntity();
        testEntity.getHeaders().put(key, messageId);
        template.save(testEntity);

        Optional<MessageIdTestEntity> testEntityFromDB = Optional.ofNullable(template.findOne(query(where("code").is(testEntity.getCode())), MessageIdTestEntity.class));
        assertTrue(testEntityFromDB.isPresent());
        assertNotNull(testEntityFromDB.get().getHeaders().get(key)); // THIS FAILING, header key is Message.Id not Message-Id
        assertEquals(messageId, testEntityFromDB.get().getHeaders().get(key));
    }
}
package com.mailor.app.data.mapping.entity;

import java.util.HashMap;
import java.util.UUID;

import com.google.common.collect.Maps;

/**
 * @author jakob
 *
 */
public class MessageIdTestEntity {

    private String code = UUID.randomUUID().toString();

    private HashMap<String, String> headers = Maps.newHashMap();

    /**
     * @return the code
     */
    public String getCode() {
        return code;
    }

    /**
     * @return the headers
     */
    public HashMap<String, String> getHeaders() {
        return headers;
    }

    /**
     * @param headers
     *            the headers to set
     */
    public void setHeaders(HashMap<String, String> headers) {
        this.headers = headers;
    }

}
package com.mailor.app.data.mapping.entity;
导入java.util.HashMap;
导入java.util.UUID;
导入com.google.common.collect.Maps;
/**
*@作者雅各布
*
*/
公共类MessageIdTestEntity{
私有字符串代码=UUID.randomUUID().toString();
private HashMap headers=Maps.newHashMap();
/**
*@返回代码
*/
公共字符串getCode(){
返回码;
}
/**
*@返回标题
*/
公共HashMap getHeaders(){
返回标题;
}
/**
*@param头文件
*要设置的标题
*/
公共void setHeaders(HashMap头){
this.headers=标题;
}
}

使用

((MappingMongoConverter)
mongoTemplate.getConverter()).setMapKeyDotReplacement("#dot#");
解释

我们在mongo db对象键中使用标准符号替换点(此处禁止使用点),使用破折号(-)替换点()

但是,如果您现在有一个带破折号的对象关键点,MongoDB mapper会将破折号替换为点,因为他不知道您以前是用破折号保存关键点还是用点保存关键点。 出于这个原因,我们必须使用独特的点键替换,比如#点#或一些罕见的东西,这些东西在对象键名称中是从来不使用的