我正在使用Jersey,Jax-rs和swagger(
Spring for injection).我的对象有一些成员和嵌入对象,其名称由多个单词组成,在代码中我使用camelCase.
我定义了一个解析器,因此按照标准惯例将它们作为下划线发出.问题是,招摇是显然没有拿起这个解析器,所以对象仍然在swagger json中显示为camelCase.
以下是我具体配置的一些细节:
我的pom.xml的片段:
4.2.3.RELEASE
2.22.1
……
javax.servlet
javax.servlet-api
3.1.0
org.glassfish.jersey.containers
jersey-container-servlet
${glassfish.jersey.version}
org.glassfish.jersey.core
jersey-server
${glassfish.jersey.version}
org.glassfish.jersey.core
jersey-client
${glassfish.jersey.version}
org.glassfish.jersey.media
jersey-media-json-jackson
${glassfish.jersey.version}
io.swagger
swagger-jersey2-jaxrs
1.5.0
…..
我只使用注释,所以我的web.xml是空的,我有一个AppInitializer类. Swagger servlet在类中初始化
public class AppInitializer implements WebApplicationInitializer {
public void onStartup(ServletContext container) throws ServletException {
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(MongoDbConfig.class);
ctx.register(CORSResponseFilter.class);
ctx.setServletContext(container);
container.addListener(new ContextLoaderListener(ctx));
container.addListener(new RequestContextListener());
ServletRegistration.Dynamic servlet = container.addServlet("jersey-servlet",
new org.glassfish.jersey.servlet.ServletContainer());
servlet.setInitParameter("jersey.config.server.provider.packages", "io.swagger.jaxrs.listing,com.my.server.config,com.my.server.resource");
servlet.setLoadOnStartup(1);
servlet.addMapping("/api/*");
ServletRegistration.Dynamic swagger = container.addServlet("SwaggerServlet",
new io.swagger.jersey.config.JerseyJaxrsConfig());
swagger.setInitParameter("api.version", "1.0.0");
swagger.setInitParameter("swagger.api.basepath", container.getContextPath()+"/api");
swagger.setLoadOnStartup(2);
}
}
这是我的主要模型:
import java.io.Serializable;
import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
/**
* @author Tamar Rosen
*
*/
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_EMPTY)
@ApiModel
public class Property implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String id;
@NotNull
private String name;
@NotNull
private String description;
private PropertyDetails propertyDetails;
private int monthlyTax;
private String schemaUrl;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public PropertyDetails getPropertyDetails() {
return propertyDetails;
}
public void setPropertyDetails(PropertyDetails propertyDetails) {
this.propertyDetails = propertyDetails;
}
public int getMonthlyTax() {
return monthlyTax;
}
public void setMonthlyTax(int monthlyTax) {
this.monthlyTax = monthlyTax;
}
public String getSchemaUrl() {
return schemaUrl;
}
public void setSchemaUrl(String schemaUrl) {
this.schemaUrl = schemaUrl;
}
}
在ContextResolver类中设置CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES.这样可以正常工作,除非它没有反映在由swagger生成的doc中.
以下是ContextResolver实现:
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
@Provider
public class ObjectMapperContextResolver implements ContextResolver {
private final ObjectMapper mapper;
public ObjectMapperContextResolver() {
mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(
PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES
);
}
public ObjectMapper getContext(Class> type) {
return mapper;
}
}
我怀疑问题是swagger servlet没有看到Context解析器,但我不知道如何解决这个问题