0

我有一个简单的控制器和休息 API,如下所示,我想将“名称”、“价格”和“描述”查询值映射到ProductSearchCriteria

    @Controller("/api/v1/product")
    public class ProductController {
        private static final Logger LOG = LoggerFactory.getLogger(ProductController.class);
    
        @Operation(summary = "Find all products")
        @ApiResponses(value = {@ApiResponse(content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ProductViewModel.class))})})
        @Get(uri="/")
        List<ProductViewModel> find(@Valid ProductSearchCriteria searchCriteria) {
            LOG.info("Finding all the products");
            //return productProducer.find(searchCriteria);
            return new ArrayList<>();
        }
    }

产品搜索条件

public class ProductSearchCriteria {
    @JsonProperty("name")
    Optional<String> name;

    @JsonProperty("price")
    Optional<Float> price;

    @JsonProperty("description")
    Optional<String> description;

    public Optional<String> getName() {
        return name;
    }

    public void setName(Optional<String> name) {
        this.name = name;
    }

    public Optional<Float> getPrice() {
        return price;
    }

    public void setPrice(Optional<Float> price) {
        this.price = price;
    }

    public Optional<String> getDescription() {
        return description;
    }

    public void setDescription(Optional<String> description) {
        this.description = description;
    }
}

错误

Error: 400 Bad Request
    {
      "message": "Required argument [ProductSearchCriteria searchCriteria] not specified",
      "path": "/searchCriteria",
      "_links": {
        "self": {
          "href": "/api/v1/product?name=string&price=0&description=string",
          "templated": false
        }
      }
    }
4

1 回答 1

2

您错过了@Get注释上的某些内容

    @Operation(summary = "Find all products")
    @ApiResponses(value = {@ApiResponse(content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ProductViewModel.class))})})
    @Get(uri="/{?searchCriteria*}")
    List<ProductViewModel> find(@Valid ProductSearchCriteria searchCriteria) {
        LOG.info("Finding all the products");
        //return productProducer.find(searchCriteria);
        return new ArrayList<>();
    }

你也错过了@Introspected你的ProductSearchCriteriaPOJO。

由于您使用的是@Valid我会在里面使用验证注释ProductSearchCriteria代替Optional

于 2020-10-06T15:57:39.373 回答