Spring REST API Swagger UI @ModelAttribute请求URL和参数类型

时间:2015-12-15 11:42:06

标签: spring rest swagger swagger-ui

我有一些问题试图让我的招摇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) {

1 个答案:

答案 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);