我有一个grails应用程序,我正在尝试绑定到SSO服务。当我做cf env myapp
时,我可以看到以下内容。
"p-identity": [
{
"credentials": {
"auth_domain": "https://someurl",
"client_id": "968c",
"client_secret": "b44df"
},
"label": "p-identity",
"name": "sso",
"plan": "ssotest",
"provider": null,
"syslog_drain_url": null,
"tags": [],
"volume_mounts": []
}
]
为了与服务绑定,我使用以下 springcloud 库:
compile (group: 'org.springframework.cloud', name: 'spring-cloud-cloudfoundry-connector', version: '1.2.3.RELEASE' ) {
excludes 'slf4j-api', 'slf4j-log4j12', 'slf4j'
}
compile group: 'org.springframework.cloud', name: 'spring-cloud-spring-service-connector', version: '1.2.3.RELEASE'
然后我创建两个类:SsoServiceInfo
和SsoServiceInfoCreator
服务信息.java
package com.acme.cfservice;
import org.springframework.cloud.service.BaseServiceInfo;
public class SsoServiceInfo extends BaseServiceInfo {
public static final String P_SSO_ID = "p-identity";
private String clientId;
private String clientSecret;
private String authDomain;
public SsoServiceInfo(String clientId, String clientSecret, String authDomain) {
super(P_SSO_ID);
this.clientId = clientId;
this.clientSecret = clientSecret;
this.authDomain = authDomain;
}
public String getClientId() {
return clientId;
}
public String getClientSecret() {
return clientSecret;
}
public String getAuthDomain() {
return authDomain;
}
}
SSO服务信息创建者.java
package com.acme.cfservice;
import org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator;
import org.springframework.cloud.cloudfoundry.Tags;
import java.util.Map;
public class SsoServiceInfoCreator extends CloudFoundryServiceInfoCreator<SsoServiceInfo> {
public SsoServiceInfoCreator() {
super(new Tags());
}
@Override
public boolean accept(Map<String, Object> serviceData) {
return serviceData.get("label").equals(SsoServiceInfo.P_SSO_ID);
}
@Override
public SsoServiceInfo createServiceInfo(Map<String, Object> serviceData) {
Map<String, Object> credentials = getCredentials(serviceData);
String clientId = (String) credentials.get("client_id");
String clientSecret = (String) credentials.get("client_secret");
String authDomain = (String) credentials.get("auth_domain");
return new SsoServiceInfo(clientId, clientSecret, authDomain);
}
}
我在web-app/META-INF/services
中创建一个名为org.springframework.cloud.cloudfoundry.CloudFoundryServiceInfoCreator
的文件,并在其中输入以下行
com.acme.cfservice.SsoServiceInfoCreator
问题
但是,当我部署应用程序时,在以下代码行上收到错误:
def ssoService = (SsoServiceInfo) new CloudFactory().cloud?.getServiceInfo("sso");
我得到的错误是:
OUT org.springframework.beans.factory.BeanCreationException: Error 创建在 ServletContext 中定义的名称为 'pluginManager' 的 bean resource [/WEB-INF/applicationContext.xml]:初始化方法的调用 失败;嵌套异常是 org.codehaus.groovy.runtime.typehandling.GroovyCastException: 不能 投射对象 "org.springframework.cloud.service.BaseServiceInfo@6d2369a8" 类 'org.springframework.cloud.service.BaseServiceInfo' 到 class 'com.acme.oauth.SsoServiceInfo'
我应该在这里做什么不同的事情?我的班级SsoServiceInfo
明显扩展org.springframework.cloud.service.BaseServiceInfo
,那我为什么要CastException
呢?
您的SsoServiceInfoCreator.accept
方法与您显示的有效负载不一致。具体来说,您的有效负载中没有"标签"。因此,FallbackBaseServiceInfoCreator.java
开始创造BaseServiceInfo
.您可能希望使用服务有效负载的一些其他属性来实现accept
方法。