无法将对象'org.springframework.cloud.service.BaseServiceInfo@31f7615f'强制转换为类'com.acme.oauth.SsoService



我有一个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'

然后我创建两个类:SsoServiceInfoSsoServiceInfoCreator

服务信息.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方法。

最新更新