servicecomb-java-chassis icon indicating copy to clipboard operation
servicecomb-java-chassis copied to clipboard

生成的服务契约和代码接口不一致

Open Github652911031 opened this issue 2 years ago • 2 comments

框架版本: java-chassis-bom 2.7.6

问题: 在接口中定义的请求参数类里,如果含有两个类名相同,但是类路径不一样的字段,生成的服务契约,和实际代码不一致。

接口定义:

@RestSchema(schemaId = "Provider")
@RequestMapping(path = "/", produces = MediaType.APPLICATION_JSON)
public class ProviderController implements ProviderApi {

    @Override
    @RequestMapping(value = "call", method = RequestMethod.POST)
    public ProviderRsp call(@RequestBody ProviderReq providerReq) {
        return new ProviderRsp();
    }
} 

请求类:

public class ProviderReq {

    private List<InnerClass> innerClassList;

    private String baseField;

    private Context context;

    public String getBaseField() {
        return baseField;
    }

    public void setBaseField(String baseField) {
        this.baseField = baseField;
    }

    public List<InnerClass> getInnerClassList() {
        return innerClassList;
    }

    public void setInnerClassList(List<InnerClass> innerClassList) {
        this.innerClassList = innerClassList;
    }

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }
}

innerClassList 中的InnerClass路径为com.xx.zy.provider.model.InnerClass,包含field3和field4两个字段

Context中也有一个List<InnerClass>, 字段名是innerClass,类路径com.xx.zy.provider.model.inner.InnerClass,包含field1和field2两个字段

public class Context {

    private List<InnerClass> innerClass;

    public List<InnerClass> getInnerClass() {
        return innerClass;
    }

    public void setInnerClass(List<InnerClass> innerClass) {
        this.innerClass = innerClass;
    }
}

image 从看板上发现,生成的服务契约里面,只有一个InnerClass的定义(应该有两个),导致innerClass和innerClassList均指向了同一个InnerClass,和接口定义不符。目前尚未发现对功能有影响,但是这种情况下,如何获取接口服务契约?

Github652911031 avatar Sep 23 '22 08:09 Github652911031

这种类名重复的情况会有问题,避免在一个 RestSchema 里面存在重复的model类名(package 不同, 类名一样)。

liubao68 avatar Sep 23 '22 09:09 liubao68

那请问我还有什么办法能够获取服务的接口契约么

Github652911031 avatar Sep 23 '22 09:09 Github652911031

那请问我还有什么办法能够获取服务的接口契约么

你的意思是再消费端代码层面获取服务端的接口契约信息?

fanjiwang1992 avatar Oct 22 '22 02:10 fanjiwang1992

那请问我还有什么办法能够获取服务的接口契约么

你的意思是再消费端代码层面获取服务端的接口契约信息?

不一定是在消费端,就是能够获取到正确的接口契约(yml格式)就行

Github652911031 avatar Oct 24 '22 08:10 Github652911031

不一定是在消费端,就是能够获取到正确的接口契约(yml格式)就行 注册中心有获取契约的接口吧,直接从接口拿呗

yanghao605 avatar Nov 22 '22 01:11 yanghao605

可以看下 ServiceRegistryClient , 会使用一些实现层面的API。 或者

   Swagger swagger = scbEngine.getSwaggerLoader().loadLocalSwagger(
        producerMicroserviceMeta.getAppId(),
        producerMicroserviceMeta.getShortName(),
        schemaId);

liubao68 avatar Nov 22 '22 02:11 liubao68