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

标签 java spring pojo http-request-parameters

我正在尝试将请求查询参数中的某些值映射到 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

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

有办法实现吗?

最佳答案

实现它的方法是使用 @RequestParam Map<String, String> filters与其他请求参数一起使用或仅使用映射作为请求参数。因为所有参数都会包含在 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 。

仅包含请求 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/

相关文章:

java - 如何增加 Tomcat Java header 大小限制

java - Eclipse - 如何设置默认系统库

java - 从 Mongo 集合创建 Java POJO

linux - 优雅地终止 spring boot 应用程序

java - spring 集成中的自定义并发 TcpOutboundGateway

java - 如何解决pojo中字符串/日期字段数据类型转换的问题?

java - 这些是同义词、彼此的子集还是完全不同?

java - Hibernate 多对多级联删除

java - 在 JAX-RS 序列化期间保留 EntityManager session

java - Spring数据jpa deleteBy查询不起作用