如何将 swagger.json 映射到 Swagger 对象?
How to map a swagger.json to Swagger Object?
我目前正在尝试将 swagger.json 文件映射到 io.swagger.models.Swagger.class。
我尝试使用 com.fasterxml.jackson.databind.ObjectMapper.class 来解决问题:
new ObjectMapper().readValue(file.getInputStream(), Swagger.class)`
但我遇到了这个异常:
"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])"
问题是 Swagger class 中的参数字段是这样的:
protected Map<String, Parameter> parameters;
这里的Parameter是一个Interface,所以ObjectMapper不知道要实例化哪个class(BodyParameter, PathParameter, FormParameter...)
我希望将 swagger.json 文件加载到 Swagger 对象中。
感谢您的帮助。
我找到了,我需要实现反序列化器才能明确声明要使用哪个 class 构造函数。我遇到了参数、模型和 属性 的问题,它们都是接口。
这是代码:
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);
只是一个例子来澄清事情,我以后可以让它更灵活:
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);
}
}
}
其他反序列化器也一样。希望对你有帮助。
与 Rayen 的回答类似,您必须注册解串器。 Swagger 在 io.swagger:swagger-core
.
中的 io.swagger.util
中为其对象(例如参数、属性、模型)提供序列化程序
我目前正在尝试将 swagger.json 文件映射到 io.swagger.models.Swagger.class。 我尝试使用 com.fasterxml.jackson.databind.ObjectMapper.class 来解决问题:
new ObjectMapper().readValue(file.getInputStream(), Swagger.class)`
但我遇到了这个异常:
"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])"
问题是 Swagger class 中的参数字段是这样的:
protected Map<String, Parameter> parameters;
这里的Parameter是一个Interface,所以ObjectMapper不知道要实例化哪个class(BodyParameter, PathParameter, FormParameter...)
我希望将 swagger.json 文件加载到 Swagger 对象中。
感谢您的帮助。
我找到了,我需要实现反序列化器才能明确声明要使用哪个 class 构造函数。我遇到了参数、模型和 属性 的问题,它们都是接口。
这是代码:
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);
只是一个例子来澄清事情,我以后可以让它更灵活:
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);
}
}
}
其他反序列化器也一样。希望对你有帮助。
与 Rayen 的回答类似,您必须注册解串器。 Swagger 在 io.swagger:swagger-core
.
io.swagger.util
中为其对象(例如参数、属性、模型)提供序列化程序