From 879bf4ed673474534d23fae654e03205ffa7194e Mon Sep 17 00:00:00 2001 From: liubao Date: Thu, 19 Nov 2020 14:09:19 +0800 Subject: [PATCH] [SCB-2120]fix operation override when using schema interface --- .../server/SchemeInterfaceJaxrsImpl.java | 4 ++++ .../deserializer/MessageReadSchema.java | 14 +++++++------ .../swagger/engine/SwaggerEnvironment.java | 21 +++++++++++-------- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrsImpl.java b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrsImpl.java index 6800babf2b8..862db168d76 100644 --- a/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrsImpl.java +++ b/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/SchemeInterfaceJaxrsImpl.java @@ -31,6 +31,10 @@ public int reduce(int a, int b) { return a - b; } + public int add(String a, String b) { + return Integer.valueOf(a) + Integer.valueOf(b); + } + @Override public Page interfaceModel(Page model) { return model; diff --git a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/MessageReadSchema.java b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/MessageReadSchema.java index 4cd66e94a82..b8d16cfd686 100644 --- a/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/MessageReadSchema.java +++ b/foundations/foundation-protobuf/src/main/java/org/apache/servicecomb/foundation/protobuf/internal/schema/deserializer/MessageReadSchema.java @@ -164,12 +164,14 @@ public void mergeFrom(InputEx input, T message) throws IOException { n = input.readFieldNumber(); } } catch (Throwable e) { - Field protoField = fieldSchema.getProtoField(); - LOGGER.error("Failed to mergeFrom, field={}:{}, type={}", - protoField.getType().getCanonicalName(), - protoField.getName(), - protoField.getTypeName(), - e.getMessage()); + if (fieldSchema != null) { + Field protoField = fieldSchema.getProtoField(); + LOGGER.error("Failed to mergeFrom, field={}:{}, type={}", + protoField.getType().getCanonicalName(), + protoField.getName(), + protoField.getTypeName(), + e.getMessage()); + } throw e; } } diff --git a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java index 49618a071bf..d18b596c762 100644 --- a/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java +++ b/swagger/swagger-invocation/invocation-core/src/main/java/org/apache/servicecomb/swagger/engine/SwaggerEnvironment.java @@ -104,7 +104,9 @@ public SwaggerProducer createProducer(Object producerInstance, Swagger swagger) } public SwaggerProducer createProducer(Object producerInstance, Class schemaInterface, Swagger swagger) { - swagger = checkAndGenerateSwagger(producerInstance, schemaInterface, swagger); + Class producerCls = targetSwaggerClass(producerInstance, schemaInterface); + + swagger = checkAndGenerateSwagger(producerCls, swagger); Map, ContextArgumentMapperFactory> contextFactories = SPIServiceUtils .getOrLoadSortedService(ProducerContextArgumentMapperFactory.class) @@ -115,7 +117,6 @@ public SwaggerProducer createProducer(Object producerInstance, Class schemaIn SwaggerOperations swaggerOperations = new SwaggerOperations(swagger); - Class producerCls = BeanUtils.getImplClassFromBean(producerInstance); Map visibleProducerMethods = MethodUtils.findSwaggerMethodsMapOfOperationId(producerCls); SwaggerProducer producer = new SwaggerProducer(); @@ -159,15 +160,17 @@ public SwaggerProducer createProducer(Object producerInstance, Class schemaIn return producer; } - private Swagger checkAndGenerateSwagger(Object producerInstance, Class schemaInterface, Swagger swagger) { + private Swagger checkAndGenerateSwagger(Class swaggerClass, Swagger swagger) { if (swagger == null) { - if (schemaInterface != null && !Object.class.equals(schemaInterface)) { - swagger = SwaggerGenerator.generate(schemaInterface); - } else { - Class producerCls = BeanUtils.getImplClassFromBean(producerInstance); - swagger = SwaggerGenerator.generate(producerCls); - } + swagger = SwaggerGenerator.generate(swaggerClass); } return swagger; } + + private Class targetSwaggerClass(Object producerInstance, Class schemaInterface) { + if (schemaInterface != null && !Object.class.equals(schemaInterface)) { + return schemaInterface; + } + return BeanUtils.getImplClassFromBean(producerInstance); + } }