diff --git a/demo/demo-pojo/pojo-client/src/main/resources/META-INF/spring/pojo.client.bean.xml b/demo/demo-pojo/pojo-client/src/main/resources/META-INF/spring/pojo.client.bean.xml
index 3ba39d33f4d..5a7faa49fd6 100644
--- a/demo/demo-pojo/pojo-client/src/main/resources/META-INF/spring/pojo.client.bean.xml
+++ b/demo/demo-pojo/pojo-client/src/main/resources/META-INF/spring/pojo.client.bean.xml
@@ -27,10 +27,6 @@
-
-
-
diff --git a/demo/demo-spring-boot-transport/demo-spring-boot-pojo-client/src/main/resources/META-INF/spring/pojo.client.bean.xml b/demo/demo-spring-boot-transport/demo-spring-boot-pojo-client/src/main/resources/META-INF/spring/pojo.client.bean.xml
index 8e715fc0b9f..98a273b5137 100644
--- a/demo/demo-spring-boot-transport/demo-spring-boot-pojo-client/src/main/resources/META-INF/spring/pojo.client.bean.xml
+++ b/demo/demo-spring-boot-transport/demo-spring-boot-pojo-client/src/main/resources/META-INF/spring/pojo.client.bean.xml
@@ -24,9 +24,6 @@
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.huawei.com/schema/paas/cse/rpc classpath:META-INF/spring/spring-paas-cse-rpc.xsd">
-
-
diff --git a/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/Invoker.java b/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/Invoker.java
index 28413193744..00d7e7951b3 100644
--- a/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/Invoker.java
+++ b/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/Invoker.java
@@ -16,7 +16,14 @@
package io.servicecomb.provider.pojo;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+
+import org.springframework.util.StringUtils;
+
+import io.servicecomb.core.CseContext;
import io.servicecomb.core.Invocation;
+import io.servicecomb.core.definition.MicroserviceMeta;
import io.servicecomb.core.definition.SchemaMeta;
import io.servicecomb.core.invocation.InvocationFactory;
import io.servicecomb.core.provider.consumer.InvokerUtils;
@@ -25,27 +32,64 @@
import io.servicecomb.swagger.engine.SwaggerConsumerOperation;
import io.servicecomb.swagger.invocation.Response;
import io.servicecomb.swagger.invocation.exception.ExceptionFactory;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
public class Invoker implements InvocationHandler {
+ // 原始数据
+ private String microserviceName;
+
+ private String schemaId;
+
+ private Class> consumerIntf;
+
+ // 生成的数据
private SchemaMeta schemaMeta;
- private ReferenceConfig config;
+ private ReferenceConfig referenceConfig;
private SwaggerConsumer swaggerConsumer;
- public void init(ReferenceConfig config, SchemaMeta schemaMeta,
- SwaggerConsumer swaggerConsumer) {
- this.config = config;
- this.schemaMeta = schemaMeta;
- this.swaggerConsumer = swaggerConsumer;
+ public Invoker(String microserviceName, String schemaId, Class> consumerIntf) {
+ this.microserviceName = microserviceName;
+ this.schemaId = schemaId;
+ this.consumerIntf = consumerIntf;
+ }
+
+ public Class> getConsumerIntf() {
+ return consumerIntf;
+ }
+
+ public void prepare() {
+ referenceConfig = CseContext.getInstance().getConsumerProviderManager().getReferenceConfig(microserviceName);
+ MicroserviceMeta microserviceMeta = referenceConfig.getMicroserviceMeta();
+
+ if (StringUtils.isEmpty(schemaId)) {
+ // 未指定schemaId,看看consumer接口是否等于契约接口
+ schemaMeta = microserviceMeta.findSchemaMeta(consumerIntf);
+ if (schemaMeta == null) {
+ // 尝试用consumer接口名作为schemaId
+ schemaId = consumerIntf.getName();
+ schemaMeta = microserviceMeta.ensureFindSchemaMeta(schemaId);
+ }
+ } else {
+ schemaMeta = microserviceMeta.ensureFindSchemaMeta(schemaId);
+ }
+
+ if (consumerIntf == null) {
+ consumerIntf = schemaMeta.getSwaggerIntf();
+ }
+
+ this.swaggerConsumer = CseContext.getInstance().getSwaggerEnvironment().createConsumer(consumerIntf,
+ schemaMeta.getSwaggerIntf());
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ if (swaggerConsumer == null) {
+ prepare();
+ }
+
Invocation invocation =
- InvocationFactory.forConsumer(config, schemaMeta, method.getName(), null);
+ InvocationFactory.forConsumer(referenceConfig, schemaMeta, method.getName(), null);
SwaggerConsumerOperation consumerOperation = swaggerConsumer.findOperation(method.getName());
consumerOperation.getArgumentsMapper().toInvocation(args, invocation);
diff --git a/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/reference/PojoReferenceMeta.java b/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/reference/PojoReferenceMeta.java
index 565e1d300c1..443851bbae4 100644
--- a/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/reference/PojoReferenceMeta.java
+++ b/providers/provider-pojo/src/main/java/io/servicecomb/provider/pojo/reference/PojoReferenceMeta.java
@@ -16,21 +16,22 @@
package io.servicecomb.provider.pojo.reference;
-import io.servicecomb.core.CseContext;
-import io.servicecomb.core.definition.MicroserviceMeta;
-import io.servicecomb.core.definition.SchemaMeta;
-import io.servicecomb.core.provider.CseBeanPostProcessor.EmptyBeanPostProcessor;
-import io.servicecomb.core.provider.consumer.ReferenceConfig;
-import io.servicecomb.foundation.common.exceptions.ServiceCombException;
-import io.servicecomb.provider.pojo.Invoker;
-import io.servicecomb.swagger.engine.SwaggerConsumer;
import java.lang.reflect.Proxy;
+
import javax.inject.Inject;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.beans.factory.InitializingBean;
-import org.springframework.util.StringUtils;
+
+import io.servicecomb.core.provider.CseBeanPostProcessor.EmptyBeanPostProcessor;
+import io.servicecomb.foundation.common.exceptions.ServiceCombException;
+import io.servicecomb.provider.pojo.Invoker;
public class PojoReferenceMeta implements FactoryBean