Spring MongoDB插入不需要的对象

时间:2017-02-23 05:00:14

标签: java spring mongodb

我无法找到有关此问题的单个网页或其他帖子。因此,我在这里发帖。

在我存储到我的mongodb的文件中,我有这些东西出现了:

"itemModifiers" : [
  {
    "val$implicitModifierString" : "16% increased Spell Damage",
    "modifierName" : "16% increased Spell Damage"
  }
]

val$implicitModifierString实际上是我的Java代码中的一个变量,它没有设置为ItemModifiers.class实例。基本上,当我在我的类中设置一个变量存储到MongoDb时,我用来设置该变量的任何变量或对象也会存储到数据库中(或者至少对我来说是这样的!)。

以下是该过程的示例代码示例(如果您讨厌地图,抱歉;这里不太相关。):

public ItemModifier deriveModifier(final String modifier) {
    for (Pattern outerKey : tierMap.keySet()) {
      if (outerKey.matcher(modifier).matches()) {
        HashMap<Pattern, ItemModifierTier> innerMap = tierMap.get(outerKey);
        for (Pattern innerKey : innerMap.keySet()) {
          if (innerKey.matcher(modifier).matches()) {
            Matcher innerMatcher = innerKey.matcher(modifier);
            Double[] tierValues = new Double[innerMatcher.groupCount()];
            innerMatcher.find();
            for (int i = 1; i <= innerMatcher.groupCount(); i++) {
              tierValues[i - 1] = Double.valueOf(innerMatcher.group(i));
            }
            return new ItemModifier() {{
              setModifierName(modifier);
              setModifierTerm(termMap.get(outerKey.pattern()));
              setModifierTier(innerMap.get(innerKey));
              setModifierType(itemModifierType);
              setModifierValues(tierValues);
            }};
          }
        }
      }
    }
    return null;
  }

这里是ItemModifier类(故意为每个字段编制索引,因为它们都可以通过服务查询;我还没有创建复合索引,但计划一旦手头的问题被排序):

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
  "modifierName",
  "modifierTerm",
  "modifierType",
  "modifierTier",
  "modifierValues",
  "modifierAverage"
})
public class ItemModifier {

  @Indexed
  @JsonProperty("modifierName")
  private String modifierName;
  @Indexed
  @JsonProperty("modifierTerm")
  private String modifierTerm;
  @Indexed
  @JsonProperty("modifierType")
  private ItemModifierType modifierType;
  @Indexed
  @JsonProperty("modifierTier")
  private ItemModifierTier modifierTier;
  @Indexed
  @JsonProperty("modifierValues")
  private Double[] modifierValues;
  @Indexed
  @JsonProperty("modifierAverage")
  private Double modifierAverage;

  public ItemModifier() {
  }

  public String getModifierName() {
    return modifierName;
  }

  public void setModifierName(String modifierName) {
    this.modifierName = modifierName;
  }
//... the other getters/setters
}

ItemModifiers.class保存在ItemDocument.class内,只需调用mongoOperations.insert(itemDocumentInstance);即可存储到mongo数据库。

如果重要,这是我的mongoConfig.xml:

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mongo="http://www.springframework.org/schema/data/mongo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/data/mongo
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
          http://www.springframework.org/schema/beans
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

  <mongo:mongo host="127.0.0.1" port="27017"/>
  <mongo:db-factory dbname="public-stash-api"/>

  <bean id="mappingContext"
        class="org.springframework.data.mongodb.core.mapping.MongoMappingContext"/>

  <bean id="defaultMongoTypeMapper"
        class="org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper">
    <constructor-arg name="typeKey">
      <null/>
    </constructor-arg>
  </bean>

  <bean id="mappingMongoConverter"
        class="org.springframework.data.mongodb.core.convert.MappingMongoConverter">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
    <constructor-arg name="mappingContext" ref="mappingContext"/>
    <property name="typeMapper" ref="defaultMongoTypeMapper"/>
  </bean>

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

</beans>

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

你正在将杰克逊与MongoDB混合在一起。 MongoDB使用文档这一事实并不意味着它使用的是Jackson。 MongoDB以BSON(二进制JSON)格式存储文档,但您无法使用Jackson注释自定义文档的存储方式。

出于这个目的,有Spring Data MongoDB注释(如org.springframework.data.mongodb.core.mapping.Field)。您实际上在代码中使用了其中一个(org.springframework.data.mongodb.core.index.Indexed)。