【问题标题】:Spring Data mongo custom Converter is not calling and not savingSpring Data mongo自定义转换器不调用也不保存
【发布时间】:2017-11-09 09:33:29
【问题描述】:

我有一个 POJO。我想通过使用 spring data mongodb 添加一些额外的字段来将它保存到 mongoDB。为此,我创建了自定义转换器。但是这个自定义的自定义转换器没有调用,也没有按照自定义转换器保存。请帮帮我

这里是 MongoDbConfiguration 类:

@Configuration
@EnableMongoRepositories(basePackages = { "com.db.sample" })
@ComponentScan(basePackages = "com.db.sample")
public class MongoDbConfiguration extends AbstractMongoConfiguration {

    @Override
    protected String getDatabaseName() {
        return "test";
    }

    @Override
    public Mongo mongo() throws Exception {
        return new MongoClient("127.0.0.1", 27017);
    }

    @Override
    public CustomConversions customConversions() {
        List<Converter<?, ?>> converterList = new ArrayList<Converter<?, ?>>();
        converterList.add(new SampleEventWriterConverter());
        return new CustomConversions(converterList);
    }

    @Override
    public String getMappingBasePackage() {
        return "com.db.sample";
     }

    @Bean
    public MongoTemplate mongoTemplate() throws Exception {
        MongoTemplate mongoTemplate = new MongoTemplate(mongo(), "test");
        MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
        mongoMapping.setCustomConversions(customConversions());
        mongoMapping.afterPropertiesSet();
        return mongoTemplate;
    }
}

这里是 SampleEventWriterConverter 类:

@Component
public class SampleEventWriterConverter implements Converter<SampleEvent, Document> {
    @Override
    public Document convert(SampleEvent event) {
        Document doc = new Document();
        doc.put("_id", event.getId());
        // …
        doc.put("sample", "test");
        for (Map.Entry<String, Object> entry : event.getFields().entrySet()) {
            doc.put(entry.getKey(), entry.getValue());
        }
        return doc;
    }
}

这里存储库类:

@Repository
public interface SampleEventRepository extends MongoRepository<SampleEvent, ObjectId> {

}

这里是POJO类:

@Document(collection = "sample_event")
public class SampleEvent implements Serializable{

    @Id
    private ObjectId id;

    private Map<String, Object> fields = new HashMap<String, Object>();

    public ObjectId getId() {
        return id;
    }

    public void setId(ObjectId id) {
        this.id = id;
    }

    @JsonAnyGetter
    public Map<String, Object> any() {
       return fields;
    }

    @JsonAnySetter
    public void set(String name, Object value) {
       fields.put(name, value);
    }
    public void setFields(Map<String, Object> obj) {
         fields = obj;
    }

    public Map<String, Object> getFields() {
        return fields;
    }
}

我的主要课程:

 @Autowired
  private SampleEventRepository sampleEventRepository;
  SampleEvent sampleEvent = new SampleEvent();
  sampleEvent.setUniqueId("1.1.1.1");
  sampleEvent.setFields(mapObj);
   ...
   sampleEventRepository.save(sampleEvent);

【问题讨论】:

    标签: spring spring-boot spring-data spring-data-mongodb


    【解决方案1】:

    这在将Converter 类型从SampleEvent & Document 更改为SampleEvent & DBObject 后工作如下(对于SampleEventWriterConverter 类)

    @Component
    public class SampleEventWriterConverter implements Converter<SampleEvent, DBObject> {
        @Override
        public DBObject convert(SampleEvent event) {
            DBObject doc = new BasicDBObject ();
            doc.put("_id", event.getId());
            // …
            doc.put("sample", "test");
            for (Map.Entry<String, Object> entry : event.getFields().entrySet()) {
                doc.put(entry.getKey(), entry.getValue());
            }
            return doc;
        }
    }
    

    【讨论】:

    • 您的存储库是否使用转换器?还是只有 mongoTemplate 在 MongoDBConfig 中?
    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 2016-03-16
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    相关资源
    最近更新 更多