gpt4 book ai didi

java - Spring Controller : bind query parameters to custom POJO fields

转载 作者:行者123 更新时间:2023-12-04 09:44:04 25 4
gpt4 key购买 nike

我正在尝试将某些值从请求查询参数映射到 POJO 参数,如下所示。
这是 POJO:

import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;

import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
import java.util.Map;

@Data
@Builder
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Person {
@NotNull(message = "personId cannot be null")
@Min(value = 0)
private Long personId;

@NotNull(message = "from date cannot be null")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime from;

@NotNull(message = "to date cannot be null")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
private LocalDateTime to;

private Map<String, String> filters;
}

这是 Controller :
    @GetMapping(path = "/persons")
public ResponseEntity<Integer> getPersons(@Valid final Person personRequest) throws Exception {
return ResponseEntity.ok(personService.getPersonsCount(personRequest));
}

我想将请求查询参数映射到这个 pojo 的属性。这是预期的请求:
{application_url}/persons?personId=12&from=2017-03-22T00:00:00&to=2019-03-22T00:00:00&country=UK&company=xyz

我要 map personId, from, to到 POJO 中的相应属性并映射其余的查询参数 nationality, company到过滤器映射。换句话说 personId, to, from在请求中只是静态的,其余参数可能会有所不同,我们可以有 salary=1000&minAage=31而不是 country=UK&company=xyz所以我想将其余的参数映射到 filters map 。

有没有办法实现?

最佳答案

实现它的方法是使用 @RequestParam Map<String, String> filters与其他请求参数或仅使用 map 作为请求参数。因为所有参数都将包含在 map 中。

请求中包含所有参数的示例:

@GetMapping(path = "persons")
public ResponseEntity<Integer> getPersons(@RequestParam Long personId,
@RequestParam String from,
@RequestParam String to,
@RequestParam Map<String, String> filters) {
Person person = Person.builder()
.personId(personId)
.from(getDate(from))
.to(getDate(to))
.filters(filterMap(filters))
.build();
return ResponseEntity.ok(personService.getPersonsCount(person));
}

private LocalDateTime getDate(String date) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
return LocalDateTime.parse(date, formatter);
}

private Map<String, String> filterMap(Map<String, String> request) {
request.remove("personId");
request.remove("from");
request.remove("to");
return request;
}

代码完全乱了。从 Map<String, String> filters@RequestParam ,因此它包括所有请求参数,即使是上面定义的参数。所以你需要删除 pesonId , from , to如果您不想在 filters map 。

仅使用请求映射的示例
@GetMapping(path = "persons")
public ResponseEntity<Integer> getPerson(@RequestParam Map<String, String> requestParams) {
Person person = Person.builder()
.personId(Long.valueOf(requestParams.get("personId")))
.from(getDate(requestParams.get("from")))
.to(getDate(requestParams.get("to")))
.filters(filterRequest(requestParams))
.build();
return ResponseEntity.ok(personService.getPersonsCount(person));
}

private LocalDateTime getDate(String date) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
return LocalDateTime.parse(date, formatter);
}

private Map<String, String> filterRequest(Map<String, String> request) {
request.remove("personId");
request.remove("from");
request.remove("to");
return request;
}

但是,至少我不知道在调用 Controller 端点之前将路径参数转换为 POJO 的好或简单配置,因此我建议您使用这些示例中的某些内容。否则使用请求正文或尝试使用此 example

关于java - Spring Controller : bind query parameters to custom POJO fields,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62198144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com