我有一些问题试图让我的招摇UI返回我想要的东西。
问题是我想在Swagger UI中将areaName显示为路径参数类型而不是查询。我可以使用@PathVariable
String“areaName”。
但我想在单独的请求类中验证areaname,现在我尝试使用@Valid
@ModelAttribute
代替。这个问题是Swagger给了我一个无聊的请求URL,如:
/ V1 /地区/ {AREANAME} /系列的 AREANAME = testarea &安培;从= 20151201
我希望它与使用@PathVariable
时的显示方式相同:
/ V1 /地区/ testarea /系列?从= 20151201
我尝试过使用requestclass中的@ApiParam
,甚至尝试使用hidden = true来保留控制器中的@PathVariable
,只是隐藏请求类中的@ApiParam
而不是在Swagger UI中获取areaName的副本,但隐藏似乎不起作用。我使用Swagger / SwaggerUI版本2.3.0 ..任何想法?
Requestclass:
public class AreaSeriesRequest {
@ApiParam(value = "Area selector, wich area to get series from.", required = true)
@EnergyAreas
private String areaName;
public String getAreaName() {
return AreaName;
}
public void setAreaName(String areaName) {
this.areaName = areaName;
}
控制器:
@RequestMapping(value = "/{areaName}/series", method = GET, produces = json)
@ResponseStatus(HttpStatus.OK)
public Page<GroupSeriesDto> getAreaSeriesPaginated(
//@PathVariable String areaName,
@Valid @ModelAttribute AreaSeriesRequest seriesRequest, BindingResult seriesResult,
@ModelAttribute PagingRequest pagingRequest,
Principal currentUser) {
答案 0 :(得分:0)
所以我解决这个问题的方法是仍然使用@PathVariable,而不是在areaName上使用@Valid @ModelAttribute,我为这个参数做了一个单独的验证器。
public class AreaValidator implements Validator {
private static final List<String> types = Arrays.asList(
"ALL",
"XX1",
"XX2",
"XX3",
"XX4"
);
@Override
public boolean supports(Class<?> clazz) {
return String.class.equals(clazz);
}
@Override
public void validate(Object target, Errors e) {
String value = (String) target;
if (value == null || !types.contains(value.toUpperCase())) {
e.reject(String.format("Area '%s' does not exist", value));
}
}
然后在控制器中使用它,如:
new AreaValidator().validate(areaName, seriesResult);
if (seriesResult.hasErrors())
throw new AreaNotFoundException(areaName);