2017-02-23 31 views
0

Мне не удалось найти ни одной веб-страницы или другого сообщения об этой проблеме. Следовательно, я здесь размещаю.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 и хранится в базе данных Монго просто invokin g mongoOperations.insert(itemDocumentInstance);.

В случае, если это имеет значение, это мой 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> 

Заранее спасибо за вашу помощь!

+0

Существует ли какой-либо класс, имеющий карту как свойство? особенно составные объекты ItemModifier – Barath

+0

. Переменные-члены - это Enum, Double [], Double или String. Нет карт. – Qbert

ответ

0

Вы смешиваете Джексона с MongoDB. Тот факт, что MongoDB использует документы, не означает, что он использует Джексона. MongoDB хранит документ в формате BSON (Binary JSON), но вы не можете настроить способ хранения ваших документов с помощью аннотаций Джексона.

Для этой цели имеются аннотации MongoDB Spring Data (например, org.springframework.data.mongodb.core.mapping.Field). Фактически вы использовали один из них в своем коде (org.springframework.data.mongodb.core.index.Indexed).

+0

Это хороший момент. Я исправил это (изменил JsonProoerty («...») на поле («....»)), но результат не изменился. – Qbert

0

Как выясняется, это преступник:

return new ItemModifier() {{ 
    setModifierName(modifier); 
    setModifierTerm(termMap.get(outerKey.pattern())); 
    setModifierTier(innerMap.get(innerKey)); 
    setModifierType(itemModifierType); 
    setModifierValues(tierValues); 
}}; 

Статическая Инстанциация, что вызвало странные val$inputVariables сохраняться в документах Mongo через Spring.

Смежные вопросы