当前,我在使用MongoDB进行Spring身份验证时遇到问题。我的Spring XML配置文件中有以下声明:
Spring Boot导入Spring XML文件: 我在“ spring boot main class”中导入以下“ spring configuration XML”文件,如下所示:
@SpringBootApplication
@ImportResource("classpath:META-INF/spring/Myapp-AppContext.xml")
public class MySpringBootApplication extends SpringBootServletInitializer {
.... //Some Code goes here
}
Spring Configuration XML文件:
<mongo:mongo-client id="mongo" host="localhost" port="27017" credentials="admin:mypass@mydb">
<mongo:client-options description="Connection to DB"/>
</mongo:mongo-client>
<mongo:db-factory id="myConnection" mongo-ref="mongo" dbname="mydb"/>
<mongo:template id="myOps" db-factory-ref="myConnection"/>
<mongo:repositories
base-package="com.test.app" mongo-template-ref="myOps" />
作为“ Spring Boot应用程序”运行时,出现以下错误:
例外:
原因:org.springframework.beans.ConversionNotSupportedException:无法将类型“ java.lang.String”的属性值转换为属性“凭据”所需的类型“ com.mongodb.MongoCredential []”;嵌套异常为java.lang.IllegalStateException:无法将属性“ credentials [0]”的类型“ java.lang.String”的值转换为必需的类型“ com.mongodb.MongoCredential”:找不到匹配的编辑器或转换策略 在org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(AbstractNestablePropertyAccessor.java:590)〜[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:604)〜[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:219)〜[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1658)〜[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1614)〜[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1361)〜[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:578)〜[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] ...省略了118个通用框架
异常原因:
据我了解,我认为“ Spring-data-Mongodb” JAR缺少用于转换“凭据”的“转换器”实现 < / strong>属性(它是字符串类型)到“ com.mongodb.MongoCredential”数组。
请让我知道是否存在支持身份验证机制的其他企业版本的“ spring-data-mongodb”,或者欢迎使用任何其他解决此问题的方式。
我的应用程序使用以下版本的软件:
答案 0 :(得分:1)
我使它以不同的方式工作。这是最终的Spring XML文件配置,如下所示:
<bean id="myMongoServers" class="java.util.ArrayList">
<constructor-arg>
<list>
<ref bean="myMongoServer" />
</list>
</constructor-arg>
</bean>
<bean id="myMongoServer" class="com.mongodb.ServerAddress">
<constructor-arg type="java.lang.String" name="host" value="localhost" />
<constructor-arg type="int" name="port" value="27017" />
</bean>
<bean id="myMongoCredentials" class="java.util.ArrayList">
<constructor-arg>
<list>
<ref bean="myMongoCredential" />
</list>
</constructor-arg>
</bean>
<bean id="myMongoCredential" class="com.mongodb.MongoCredential">
<constructor-arg name="mechanism" value = "#{T(com.mongodb.AuthenticationMechanism).SCRAM_SHA_1}" />
<constructor-arg type="java.lang.String" name="userName" value="admin" />
<constructor-arg type="java.lang.String" name="source" value="mydb" />
<constructor-arg type="char[]" name="password" value="mypass"/>
</bean>
<!-- MongoClient -->
<bean id="mongo" class="com.mongodb.MongoClient">
<constructor-arg ref="myMongoServers" />
<constructor-arg ref="myMongoCredentials" />
</bean>
<mongo:db-factory id="myConnection" mongo-ref="mongo" dbname="mydb"/>
<mongo:template id="myOps" db-factory-ref="myConnection"/>
<mongo:repositories base-package="com.test.app" mongo-template-ref="myOps" />
答案 1 :(得分:0)
此问题是由于凭据传递给mongo-driver的方式发生了更改。 这样,您需要提供ServerAddress和Credentials(其中一部分是用作Character []的密码)。
SCRAM-SHA-1是用于向MongoDB进行身份验证的机制。如果需要,还有其他方法可以使用相似的参数进行不同的身份验证。
如果您使用的是基于Java的配置,则可以参考以下代码段:
@Bean
public MongoDbFactory mongoDbFactory() {
ServerAddress serverAddress = new ServerAddress(mongoHost, mongoPort);
MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(mongoUser, mongoDB, mongoPass.toCharArray());
MongoClient mongoClient = new MongoClient(serverAddress, mongoCredential,
new MongoClientOptions.Builder().build());
MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, mongoDB);
return dbFactory;
}
@Bean
public MongoTemplate mongoTemplate(@Autowired MongoDbFactory mongoDbFactory) {
return new MongoTemplate(mongoDbFactory);
}
请参阅:https://www.w3.org/TR/wai-aria-practices/examples/combobox/aria1.1pattern/listbox-combo.html