스프링 부트 및 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
'programing' 카테고리의 다른 글
WordPress는 빈 스팬 태그를 제거합니다. (0) | 2023.03.15 |
---|---|
피클이야, 존이야? (0) | 2023.03.15 |
여러 함수를 호출 on클릭 리액트JS (0) | 2023.03.15 |
WordPress 블로그에서 포트 번호 변경 (0) | 2023.03.15 |
Oracle: 숫자 값만 있는 행을 반환하는 SQL 쿼리 (0) | 2023.03.15 |