[英]Java - MongoDB mapping object keys with dashes (Message-Id) to dots (Message.Id). Spring Data MongoDB
將文檔中的MongoDB對象映射到Java哈希映射時遇到一個奇怪的問題。
如果我將帶有這樣的HashMap
的對象("Message-Id" => "something")
到某個集合中,然后再次從db中獲取它,則結果對象將具有帶有此HashMap
對象("Message.Id" => "something")
。
我在Spring Boot應用程序中使用Spring Data 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;
}
}
通過使用固定
((MappingMongoConverter)
mongoTemplate.getConverter()).setMapKeyDotReplacement("#dot#");
說明
我們在mongo db對象鍵中使用了標准替換符號來替換點(此處禁止使用點),使用破折號(-)來替換點(。)。
((MappingMongoConverter)
mongoTemplate.getConverter()).setMapKeyDotReplacement("-");
但是,如果您現在有一個帶破折號的對象鍵,MongoDB映射器將破折號替換為點,因為他不知道您之前是用破折號還是點保存鍵。 因此,我們必須使用唯一的點鍵替換,例如#dot#或罕見的東西,而您從未在對象鍵名中使用過。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.