【问题标题】:Spring REST API Swagger UI @ModelAttribute request URL and parameter typeSpring REST API Swagger UI @ModelAttribute 请求 URL 和参数类型
【发布时间】:2015-12-15 11:42:05
【问题描述】:

我在试图让我的招摇 UI 返回我想要的东西时遇到了一些问题。 问题是我想在 Swagger UI 中将 areaName 显示为 path 参数类型而不是 query。我可以通过使用@PathVariable String "areaName" 来做到这一点。

但我想在单独的请求类中验证区域名称,现在我尝试使用 @Valid @ModelAttribute 代替。问题在于 Swagger 给了我一个无聊的请求 URL,例如:

/v1/areas/{areaName}/series?areaName=testarea&from=20151201 p>

我希望它以与我使用 @PathVariable 时相同的方式显示:

/v1/areas/testarea/series?from=20151201

我曾尝试在 requestclass 中使用 @ApiParam,甚至尝试隐藏 = true 以在控制器中保留 @PathVariable 并仅在 requestclass 中隐藏 @ApiParam 以免在Swagger UI 但隐藏似乎不起作用。我正在使用 Swagger/SwaggerUI 2.3.0 版。有什么想法吗?

请求类:

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) {

【问题讨论】:

    标签: spring rest swagger swagger-ui


    【解决方案1】:

    所以我解决这个问题的方法是仍然使用@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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-11
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多