2017-11-08 11 views
0

Scope (value = prototype)을 사용하여 bean을 만들고 @JaversSpringDataAuditable 주석을 사용하여 리포지토리에 사용할 수 있습니다. 모든 데이터가 적절한 데이터베이스에 저장됩니다.dongamically mongo 데이터베이스 (multitenant)를 선택하는 방법

@Bean 
@Scope(value = "prototype") 
@Lazy(value = true) 
public Javers javers() { 

    Authentication auth = SecurityContextHolder.getContext().getAuthentication() 
    String tenantId = null 

    if (auth == null) { 
     tenantId = "unauthenticated" 
    }else{ 
     tenantId = auth.getName().toString() 
    } 

    System.out.println("Selected " + tenantId.toString()) 

    MongoRepository javersMongoRepository = 
      new MongoRepository(mongo().getDatabase(tenantId)); 

    return JaversBuilder.javers() 
      .registerJaversRepository(javersMongoRepository) 
      .build(); 
} 

특정 클래스에서 나는 Javers 커밋보다 세세한 제어가 필요합니다. 내가 커밋 매뉴얼을 호출 할 때, 항상

이 코드는 항상

@Autowired 
Javers javers 
def saveDTO(AuthUtils authUtils, DTO dto){ 
    javers.commit(authUtils.currentUser.email, dto) 
} 

어떤 도움이 감지 될 것 "인증되지 않은"이라는 데이터베이스에 데이터를 저장 "인증되지 않은"나를 돌아갑니다. 감사.

답변

0

현재 콘크리트 MongoDatabase를 JaVers 인스턴스에 전달해야하며 런타임에는 변경할 수 없습니다. 당신 (멀티 테넌트)의 경우를 들어, MongoRepository API는이 방식으로 작동한다 :

MongoDatabaseProvider dbProvider = new MongoDatabaseProvider() { 
    public MongoDatabase provide() { 
     SecurityContextHolder.getContext().getAuthentication() 
     ... your code 
    } 
} 

MongoRepository javersMongoRepository = 
      new MongoRepository(dbProvider); 
} 

이 JaVers에서이 API를 구현하기 쉽습니다. 이 작업을 원할 경우 홍보를 수락합니다.