多个查询值绑定在POJO中

huangapple go评论93阅读模式
英文:

Multiple query values binding in POJO

问题

我有一个简单的控制器和REST API,如下所示,我想将 'name'、'price' 和 'description' 查询值映射到 ProductSearchCriteria 中:

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

产品搜索条件

  1. public class ProductSearchCriteria {
  2. @JsonProperty("name")
  3. Optional<String> name;
  4. @JsonProperty("price")
  5. Optional<Float> price;
  6. @JsonProperty("description")
  7. Optional<String> description;
  8. public Optional<String> getName() {
  9. return name;
  10. }
  11. public void setName(Optional<String> name) {
  12. this.name = name;
  13. }
  14. public Optional<Float> getPrice() {
  15. return price;
  16. }
  17. public void setPrice(Optional<Float> price) {
  18. this price = price;
  19. }
  20. public Optional<String> getDescription() {
  21. return description;
  22. }
  23. public void setDescription(Optional<String> description) {
  24. this.description = description;
  25. }
  26. }

错误

  1. 错误:400 Bad Request
  2. {
  3. "message": "Required argument [ProductSearchCriteria searchCriteria] not specified",
  4. "path": "/searchCriteria",
  5. "_links": {
  6. "self": {
  7. "href": "/api/v1/product?name=string&price=0&description=string",
  8. "templated": false
  9. }
  10. }
  11. }
英文:

I have a simple controller and rest API as below in which I want to map 'name', 'price' and 'description' querie values into ProductSearchCriteria :

  1. @Controller(&quot;/api/v1/product&quot;)
  2. public class ProductController {
  3. private static final Logger LOG = LoggerFactory.getLogger(ProductController.class);
  4. @Operation(summary = &quot;Find all products&quot;)
  5. @ApiResponses(value = {@ApiResponse(content = {@Content(mediaType = &quot;application/json&quot;, schema = @Schema(implementation = ProductViewModel.class))})})
  6. @Get(uri=&quot;/&quot;)
  7. List&lt;ProductViewModel&gt; find(@Valid ProductSearchCriteria searchCriteria) {
  8. LOG.info(&quot;Finding all the products&quot;);
  9. //return productProducer.find(searchCriteria);
  10. return new ArrayList&lt;&gt;();
  11. }
  12. }

product search criteria

  1. public class ProductSearchCriteria {
  2. @JsonProperty(&quot;name&quot;)
  3. Optional&lt;String&gt; name;
  4. @JsonProperty(&quot;price&quot;)
  5. Optional&lt;Float&gt; price;
  6. @JsonProperty(&quot;description&quot;)
  7. Optional&lt;String&gt; description;
  8. public Optional&lt;String&gt; getName() {
  9. return name;
  10. }
  11. public void setName(Optional&lt;String&gt; name) {
  12. this.name = name;
  13. }
  14. public Optional&lt;Float&gt; getPrice() {
  15. return price;
  16. }
  17. public void setPrice(Optional&lt;Float&gt; price) {
  18. this.price = price;
  19. }
  20. public Optional&lt;String&gt; getDescription() {
  21. return description;
  22. }
  23. public void setDescription(Optional&lt;String&gt; description) {
  24. this.description = description;
  25. }
  26. }

Error

  1. Error: 400 Bad Request
  2. {
  3. &quot;message&quot;: &quot;Required argument [ProductSearchCriteria searchCriteria] not specified&quot;,
  4. &quot;path&quot;: &quot;/searchCriteria&quot;,
  5. &quot;_links&quot;: {
  6. &quot;self&quot;: {
  7. &quot;href&quot;: &quot;/api/v1/product?name=string&amp;price=0&amp;description=string&quot;,
  8. &quot;templated&quot;: false
  9. }
  10. }
  11. }

答案1

得分: 2

  1. 您在`@Get`注解上漏掉了一些内容
  2. ```java
  3. @Operation(summary = "查找所有产品")
  4. @ApiResponses(value = {@ApiResponse(content = {@Content(mediaType = "application/json", schema = @Schema(implementation = ProductViewModel.class))})})
  5. @Get(uri="/{?searchCriteria*}")
  6. List<ProductViewModel> find(@Valid ProductSearchCriteria searchCriteria) {
  7. LOG.info("查找所有产品");
  8. //return productProducer.find(searchCriteria);
  9. return new ArrayList<>();
  10. }

您还需要在ProductSearchCriteria的POJO上添加@Introspected注解。

由于您在使用@Valid,我建议在ProductSearchCriteria内部使用验证注解,而不是Optional

  1. <details>
  2. <summary>英文:</summary>
  3. You missed something on the `@Get` annotation
  4. ```java
  5. @Operation(summary = &quot;Find all products&quot;)
  6. @ApiResponses(value = {@ApiResponse(content = {@Content(mediaType = &quot;application/json&quot;, schema = @Schema(implementation = ProductViewModel.class))})})
  7. @Get(uri=&quot;/{?searchCriteria*}&quot;)
  8. List&lt;ProductViewModel&gt; find(@Valid ProductSearchCriteria searchCriteria) {
  9. LOG.info(&quot;Finding all the products&quot;);
  10. //return productProducer.find(searchCriteria);
  11. return new ArrayList&lt;&gt;();
  12. }

You also miss an @Introspected on your ProductSearchCriteria POJO.

Since you are using @ValidI would go with validation annotation inside ProductSearchCriteria in place of Optional

huangapple
  • 本文由 发表于 2020年10月6日 20:20:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/64225688.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定