2015-06-09 100 views
0

我已經按照spring-data couchbase的教程進行了設置,並且有一個成功的示例項目,其中包含單元測試用於持續執行一系列實現查詢實體的視圖的自定義實體。如何使用spring-data couchbase設置存儲桶密碼

在使用「默認」存儲桶名稱和無密碼作爲身份驗證時,這可以在本地開發環境和ci環境中正常工作。

超越這個例子,我想利用不同的存儲桶並最終使用密碼。當我創建一個新的桶(名爲「test_bucket」),並更新注入到CouchbaseConfig中的屬性(擴展AbstractCouchbaseConfiguration)以使用這個新桶的「默認」時,運行單元測試時出現以下異常。

我也嘗試在創建腳本中添加一個密碼,並在CouchbaseConfig中使用的屬性中添加相同的密碼(在這兩種情況下爲「psswd」字符串),但得到如下所示的相同異常。

那麼是否有可能使用比「默認」(並且不需要授權)更多的存儲桶,以及如何配置在此存儲桶上使用的密碼?

我已驗證存儲桶和預期視圖是否已在管理GUI的couchbase中正確創建。

2015-06-09 16:41:40 INFO ClasspathLoggingApplicationListener:55 - Application failed to start with classpath: [file:/C:/tools/cmd/cygwin64/home/akirby/workspaces/repos/blackjack/persistence/target/surefire/surefirebooter7615727324811258159.jar] 
2015-06-09 16:41:40 INFO AutoConfigurationReportLoggingInitializer:107 - 

Error starting ApplicationContext. To display the auto-configuration report enabled debug logging (start with --debug) 

2015-06-09 16:41:40 ERROR SpringApplication:338 - Application startup failed 
java.lang.NoSuchMethodError:  org.apache.commons.codec.binary.Base64.encodeBase64String([B)Ljava/lang/String; 
    at com.couchbase.client.http.HttpUtil.buildAuthHeader(HttpUtil.java:55) 
    at com.couchbase.client.ViewConnection.addOp(ViewConnection.java:205) 
    at com.couchbase.client.CouchbaseClient.addOp(CouchbaseClient.java:803) 
    at com.couchbase.client.CouchbaseClient.asyncGetView(CouchbaseClient.java:342) 
    at com.couchbase.client.CouchbaseClient.getView(CouchbaseClient.java:430) 
    at org.springframework.data.couchbase.core.CouchbaseTemplate$2.doInBucket(CouchbaseTemplate.java:223) 
    at org.springframework.data.couchbase.core.CouchbaseTemplate$2.doInBucket(CouchbaseTemplate.java:220) 
    at org.springframework.data.couchbase.core.CouchbaseTemplate.execute(CouchbaseTemplate.java:244) 
    at org.springframework.data.couchbase.core.CouchbaseTemplate.queryView(CouchbaseTemplate.java:220) 
    at org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.deleteAll(SimpleCouchbaseRepository.java:168) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.executeMethodOn(RepositoryFactorySupport.java:416) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:401) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:373) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport$DefaultMethodInvokingMethodInterceptor.invoke(RepositoryFactorySupport.java:486) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.data.couchbase.repository.support.ViewPostProcessor$ViewInterceptor.invoke(ViewPostProcessor.java:87) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
    at com.sun.proxy.$Proxy50.deleteAll(Unknown Source) 
    at com.pubtech.cms.persistence.RepositoryService.doWork(RepositoryService.java:47) 
    at com.pubtech.cms.persistence.ApplicationRepository.lambda$commandLineRunner$0(ApplicationRepository.java:83) 
    at com.pubtech.cms.persistence.ApplicationRepository$$Lambda$9/594916129.run(Unknown Source) 
    at org.springframework.boot.SpringApplication.runCommandLineRunners(SpringApplication.java:672) 
    at org.springframework.boot.SpringApplication.afterRefresh(SpringApplication.java:690) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:321) 
    at org.springframework.boot.test.SpringApplicationContextLoader.loadContext(SpringApplicationContextLoader.java:101) 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68) 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86) 
    at org.springframework.test.context.DefaultTestContext.getApplicationContext(DefaultTestContext.java:72) 
    at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:170) 
    at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:110) 
    at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:212) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:200) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:259) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:261) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:219) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:83) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:68) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:163) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:264) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153) 
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:124) 
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:200) 
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:153) 
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103) 
2015-06-09 16:41:40 INFO GenericWebApplicationContext:862 - Closing org.s[email protected]6302bbb1: startup date [Tue Jun 09 16:41:33 BST 2015]; root of context hierarchy 
2015-06-09 16:41:40 INFO CouchbaseConnection:87 - Shut down Couchbase client 
2015-06-09 16:41:40 INFO ViewConnection:87 - I/O reactor terminated 
使用需要密碼(桶「T1」,密碼「PSWD」)我看到這個驗證錯誤日誌中值區名稱時

,是有一些格式。除了純文本,passsord應該被編碼?

2015-06-10 10:55:58 INFO DefaultListableBeanFactory:822 - Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]] 
2015-06-10 10:55:59 INFO Version:27 - HV000001: Hibernate Validator 5.1.3.Final 
2015-06-10 10:56:00 ERROR SASLStepOperationImpl:93 - Error: Auth failure 
2015-06-10 10:56:00 WARN BinaryMemcachedNodeImpl:90 - Discarding partially completed op: SASL steps operation 
2015-06-10 10:56:00 WARN AuthThread:90 - Authentication failed to localhost/127.0.0.1:11210, Status: {OperationStatus success=false: cancelled} 
2015-06-10 10:56:02 WARN AuthThread:90 - Authentication failed to localhost/127.0.0.1:11210, Status: {OperationStatus success=false: Invalid arguments} 
2015-06-10 10:56:02 WARN AuthThread:90 - Authentication failed to localhost/127.0.0.1:11210, Status: {OperationStatus success=false: Invalid arguments} 

我使用couchbase-CLI從腳本創建桶,使用相同的腳本來創建工作的「默認」,而不是工作「test_bucket」(屬性是使用MVN過濾器正確注入):

# Create Bucket 
couchbase-cli bucket-create -c $COUCHBASE_HOST:$COUCHBASE_PORT -u $CB_REST_USERNAME -p $CB_REST_PASSWORD \ 
    --bucket=$BUCKET_NAME \ 
    --bucket-type=couchbase \ 
    --bucket-ramsize=200 \ 
    --bucket-replica=1 \ 
    --wait 

CouchbaseConfig類:

.. 
@Configuration 
@EnableCouchbaseRepositories(basePackages = {"com.persistence.db"}) 
@EnableAutoConfiguration 
public class CouchbaseConfig extends AbstractCouchbaseConfiguration { 

@Value("${couchbase.bucket:boris}") 
private String bucketName; 

@Value("${couchbase.bucket.password:nopwd}") 
private String password; 

@Value("${couchbase.host:127.0.0.1}") 
private String ip; 

.. 

回答

0

我覺得你有一個類似的問題,什麼我正經歷,對我來說是在@Configuration類使用@Value問題有輕微特殊要求。如果這很重要,我使用YAML作爲我的屬性文件。

添加到您的類(必須是靜態以及)

/** 
* this is required for some reason: https://jira.spring.io/browse/SPR-11773 
* 
* @return 
*/ 
@Bean 
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() { 
    return new PropertySourcesPlaceholderConfigurer(); 
+0

感謝您的建議,當我提出這個除了CouchbaseConfig類,它有沒有在與「默認」鬥正在運行的影響,沒有密碼配置(如所有教程中所示)並繼續成功運行。通過使用命名桶「t1」和密碼「pswd」,它會像以前一樣失敗。 –

+0

@AndyKirby你可以使用用戶名和密碼登錄到gui(:8091),也可以嘗試添加一些調試日誌記錄來吐出用戶名和密碼以驗證彈簧是否能夠拾取它? –

相關問題