简体   繁体   English

如何将 swagger.json 映射到 Swagger 对象?

[英]How to map a swagger.json to Swagger Object?

I am currently trying to map a swagger.json file to a io.swagger.models.Swagger.class.我目前正在尝试将 swagger.json 文件映射到 io.swagger.models.Swagger.class。 I've tried to use com.fasterxml.jackson.databind.ObjectMapper.class to solve the issue by :我尝试使用 com.fasterxml.jackson.databind.ObjectMapper.class 通过以下方式解决问题:

new ObjectMapper().readValue(file.getInputStream(), Swagger.class)`

but i got this exception:但我得到了这个例外:

"InvalidDefinitionException: Cannot construct instance of io.swagger.models.parameters.Parameter (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information at [Source: (FileInputStream); line: 28, column: 21] (through reference chain: io.swagger.models.Swagger["paths"]->java.util.LinkedHashMap["/myPath"]->io.swagger.models.Path["post"]->io.swagger.models.Operation["parameters"]->java.util.ArrayList[0])"

The problem is that the parameters field in Swagger class goes like this :问题是 Swagger 类中的参数字段是这样的:

protected Map<String, Parameter> parameters;

Parameter here is an Interface, so the ObjectMapper doesn't know which class to instantiate (BodyParameter, PathParameter, FormParameter...)这里的参数是一个接口,所以 ObjectMapper 不知道要实例化哪个类(BodyParameter、PathParameter、FormParameter...)

I expect to load a swagger.json file into a Swagger Object.我希望将 swagger.json 文件加载到 Swagger 对象中。

Thank you for your help.感谢您的帮助。

Similar to Rayen's answer, you have to register deserialisers.与 Rayen 的回答类似,您必须注册反序列化程序。 Swagger offers serializers for its objects (eg Parameter, Property, Model) in io.swagger.util within io.swagger:swagger-core .扬鞭提供串行其对象(例如,参数,性能,型号)在io.swagger.utilio.swagger:swagger-core

I found it, I needed to implement Deserializers in order to declare explicitly which class constructor to use. 我发现它,我需要实现反序列化器,以便明确声明要使用哪个类构造函数。 I had problem with Parameter, Model and Property which were all interfaces. 我有参数,模型和属性的问题,这些都是接口。

Here is the Code : 这是代码:

ObjectMapper mapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addDeserializer(io.swagger.models.parameters.Parameter.class, new ParameterDeserializer());
        module.addDeserializer(io.swagger.models.Model.class, new ModelDeserializer());
        module.addDeserializer(io.swagger.models.properties.Property.class, new PropertyDeserializer());
        mapper.registerModule(module);

Just an example to clarify things, I can make it more flexible later : 只是一个澄清事物的例子,我可以在以后更灵活:

import java.io.IOException;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

import io.swagger.models.parameters.BodyParameter;
import io.swagger.models.parameters.FormParameter;
import io.swagger.models.parameters.Parameter;
import io.swagger.models.parameters.PathParameter;
import io.swagger.models.parameters.QueryParameter;

public class ParameterDeserializer extends StdDeserializer<io.swagger.models.parameters.Parameter> {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public ParameterDeserializer() {
        this(null);
    }

    public ParameterDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public Parameter deserialize(JsonParser parser, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        final JsonNode node = parser.getCodec().readTree(parser);
        final ObjectMapper mapper = (ObjectMapper) parser.getCodec();
        if (node.get("in").toString().toLowerCase().replaceAll("\"", "").equals("path")) {
            return mapper.treeToValue(node, PathParameter.class);
        } else if (node.get("in").toString().toLowerCase().replaceAll("\"", "").equals("body")) {
            return mapper.treeToValue(node, BodyParameter.class);
        } else if (node.get("in").toString().toLowerCase().replaceAll("\"", "").equals("query")) {
            return mapper.treeToValue(node, QueryParameter.class);
        } else {
            return mapper.treeToValue(node, FormParameter.class);
        }
    }

}

Same for the other deserializers. 其他反序列化器也是如此。 Hope it helps. 希望能帮助到你。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM