programing

스프링 부트 및 MongoDB '_class' 컬럼 삭제 방법

megabox 2023. 3. 15. 19:29
반응형

스프링 부트 및 MongoDB '_class' 컬럼 삭제 방법

MongoDB Spring Data에 데이터를 삽입할 때 커스텀 "_class" 컬럼을 추가할 때 Spring Boot & MongoDB를 사용할 때 "class" 컬럼을 삭제할 수 있는 방법이 있습니까?

아니면 커스텀 타입 매퍼를 작성해야 하나요?

힌트나 조언이 있나요?

데이브의 답은 옳다.그러나 일반적으로 이 작업은 수행하지 않는 것이 좋습니다(따라서 애초에 기본적으로 활성화되어 있습니다). 이는 지속 유형 계층 또는 단순 속성 집합으로 효과적으로 폐기할 수 있습니다(예: Object. 다음 유형을 가정합니다.

@Document
class MyDocument {

  private Object object;
}

이 시점에서 설정했을 경우object값은 행복하게 유지되지만 원래 유형으로 값을 다시 읽을 수 있는 방법은 없습니다.

테스트 케이스용 임베디드 mongo db를 사용하여 이 질문에 대한 보다 최신 답변을 제공합니다.http://mwakram.blogspot.fr/2017/01/remove-class-from-mongo-documents.html에서 인용합니다.

Spring Data MongoDB는 Java 상속의 다형성 동작을 처리하기 위해 mongo 문서에 _class를 추가합니다._class를 삭제하려면 코드에서 Config 클래스를 삭제하기만 하면 됩니다.

package com.waseem.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDbFactory;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

@Configuration
public class MongoConfig {

 @Autowired MongoDbFactory mongoDbFactory;
 @Autowired MongoMappingContext mongoMappingContext;

 @Bean
 public MappingMongoConverter mappingMongoConverter() {

  DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
  MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
  converter.setTypeMapper(new DefaultMongoTypeMapper(null));

  return converter;
 }
}

다음은 조금 더 심플한 접근법입니다.

@Configuration
public class MongoDBConfig implements InitializingBean {

    @Autowired
    @Lazy
    private MappingMongoConverter mappingMongoConverter;

    @Override
    public void afterPropertiesSet() throws Exception {
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
    }
}

_class는 다음 코드를 사용하여 삭제할 수 있습니다.이것은 mongo 컨피규레이션클래스에서 사용할 수 있습니다.

@Bean
    public MongoTemplate mongoTemplate(MongoDatabaseFactory databaseFactory, MappingMongoConverter converter) {
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return new MongoTemplate(databaseFactory, converter);
    }

내 생각에 넌 이 모든 걸어야 할 것 같아@Bean타입의MongoTemplate타입 컨버터를 명시적으로 설정합니다.상세(부팅은 하지 않고 템플릿 구성만 추출):http://www.mkyong.com/mongodb/spring-data-mongodb-remove-_class-column/

RZet과 비슷하지만 상속을 회피합니다.

@Configuration
public class MongoConfiguration {

    @Autowired
    private MappingMongoConverter mappingMongoConverter;

    // remove _class
    @PostConstruct
    public void setUpMongoEscapeCharacterConversion() {
        mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));
    }

}

간단한 방법(+ Reactive Mongo Template의 경우):

  @Configuration
  public class MongoDBConfig {

    @Autowired
    private MongoClient mongoClient;

    @Value("${spring.data.mongodb.database}")
    private String dbName;

    @Bean
    public ReactiveMongoTemplate reactiveMongoTemplate() {
      ReactiveMongoTemplate template = new ReactiveMongoTemplate(mongoClient, dbName);
      MappingMongoConverter converter = (MappingMongoConverter) template.getConverter();
      converter.setTypeMapper(new DefaultMongoTypeMapper(null));
      converter.afterPropertiesSet();
      return template;
    }
  }

클래스를 제거할 변환기를 추가합니다.

MappingMongoConverter converter =
        new MappingMongoConverter(mongoDbFactory(), new MongoMappingContext());
    converter.setTypeMapper(new DefaultMongoTypeMapper(null));

MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);

    return mongoTemplate;

`

위의 정답은 권장되지 않는 여러 종속성을 사용하는 것 같습니다.예를 들어 코드를 체크하면 MongoDbFactory라고 기재되어 있습니다.MongoDbFactory는 최신 Spring 릴리즈에서 권장되지 않습니다.2020년에 스프링데이터와 함께 MongoDB를 사용한다면, 이 솔루션이 더 오래된 솔루션인 것 같습니다.즉각적인 결과를 얻으려면 이 코드 조각을 확인하십시오.100% 동작합니다.새로운 AppConfig.java 파일을 만들고 이 코드 블록을 붙여넣기만 하면 됩니다.MongoDB 문서에서 "_class" 속성이 사라지는 것을 볼 수 있습니다.

package com.reddit.redditmain.Configuration;

import org.apache.naming.factory.BeanFactory;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;  
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.convert.CustomConversions;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.DbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;

@Configuration
public class AppConfig {

@Autowired
MongoDatabaseFactory mongoDbFactory;
@Autowired
MongoMappingContext mongoMappingContext;

@Bean
public MappingMongoConverter mappingMongoConverter() {

    DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDbFactory);
    MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
    converter.setTypeMapper(new DefaultMongoTypeMapper(null));

    return converter;
    }

}
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.mongodb.MongoDatabaseFactory; 
import org.springframework.data.mongodb.core.MongoTemplate;
import 
org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import 
org.springframework.data.mongodb.core.convert.MappingMongoConverter;

@Configuration
public class MongoConfigWithAuditing {

 @Bean
 @Primary
 public MongoTemplate mongoTemplate(MongoDatabaseFactory 
 mongoDatabaseFactory, MappingMongoConverter mappingMongoConverter) {

  // this is to avoid saving _class to db
  mappingMongoConverter.setTypeMapper(new DefaultMongoTypeMapper(null));

  MongoTemplate mongoTemplate = new MongoTemplate(mongoDatabaseFactory, mappingMongoConverter);
  return mongoTemplate;
 }

}

리액티브 몽고가 있는 스프링 부츠 3

package es.dmunozfer.trading.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.mongo.MongoProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.ReactiveMongoDatabaseFactory;
import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@Configuration
@EnableReactiveMongoRepositories("es.dmunozfer.trading.repository")
public class MongoConfig extends AbstractReactiveMongoConfiguration {

    @Autowired
    private MongoProperties mongoProperties;

    @Override
    protected String getDatabaseName() {
        return mongoProperties.getDatabase();
    }

    @Bean
    @Override
    public MappingMongoConverter mappingMongoConverter(ReactiveMongoDatabaseFactory databaseFactory, MongoCustomConversions customConversions,
            MongoMappingContext mappingContext) {
        MappingMongoConverter converter = super.mappingMongoConverter(databaseFactory, customConversions, mappingContext);
        converter.setTypeMapper(new DefaultMongoTypeMapper(null));
        return converter;
    }
}

이전 답변에는 몇 가지 권장되지 않는 종속성이 있기 때문에 누군가가 _class를 kotlin에서 제거하고 업데이트하고자 할 경우에 대비하여 이 답변을 남겨둡니다.

import org.springframework.beans.factory.BeanFactory
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.mongodb.MongoDatabaseFactory
import org.springframework.data.mongodb.core.convert.DbRefResolver
import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver
import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper
import org.springframework.data.mongodb.core.convert.MappingMongoConverter
import org.springframework.data.mongodb.core.mapping.MongoMappingContext


@Configuration
internal class SpringMongoConfig {

    @Bean
    fun mappingMongoConverter(
        factory: MongoDatabaseFactory, context: MongoMappingContext,
        beanFactory: BeanFactory
    ): MappingMongoConverter {
        val dbRefResolver: DbRefResolver = DefaultDbRefResolver(factory)
        val mappingConverter = MappingMongoConverter(dbRefResolver, context)
        mappingConverter.setTypeMapper(DefaultMongoTypeMapper(null))
        return mappingConverter
    }
}

언급URL : https://stackoverflow.com/questions/23517977/spring-boot-mongodb-how-to-remove-the-class-column

반응형