java - 将所有请求参数映射到 Spring Controller 中的一个对象中

标签 java spring spring-boot jackson jackson-databind

所以,请求的 URL 看起来像

localhost:8080/contacts?id=22&name=John&eventId=11

而且我还得到了一个将请求映射到的对象

public class ContactDTO {
    private Long id;
    private String name;
    private Long eventId;
}

我使用 Controller 方法,例如将请求参数传递到对象中

@GetMapping("/contacts")
public ContactDTO contacts(ContactDTO contact) {
    // everything is awesome! contact maps clearly
    return contact;
}

问题是如何像这样映射但具有不同的名称

    localhost:8080/contacts?id=22&name=John&event_id=11

设置 @JsonAttribute 不起作用,因为 Jackson 映射器仅在请求正文中工作。 也许我应该编写自定义 HandlerMethodArgumentResolver 或类似的东西?

附注 我有一个肮脏的黑客(objectMapper 被注入(inject),所以我可以使用@JsonAttributes), 但是这种情况在数组映射上失败,与 requestbody 的相同映射工作正常

@GetMapping("/contacts")
public ContactsDTO contacts(@RequestParam Map<String,String> params) {
    ContactDTO contactDTO = objectMapper.convertValue(params,ContactDTO.class);
    return contactDTO;
}

最佳答案

既然是API设计需求,就应该在相应的DTO和端点中明确体现。

通常,这种需求源于parallel change并暗示旧类型查询将在契约(Contract)阶段被禁用。

您可以通过将所需的映射“查询参数名称到属性名称”添加到 ContactDTO 来满足该要求。最简单的方法就是添加一个额外的 setter ,如下所示

public class ContactDTO {
    private Long id;
    private String name;
    private Long eventId;

    public void setEvent_id(Long eventId) {
        this.eventId = eventId;
    }
}

如果您更喜欢不可变的 DTO,那么提供适当的构造函数也应该有效

@Value
public class ContactDTO {
    private Long id;
    private String name;
    private Long eventId;

    public ContactDTO(Long id, String name, String eventId, String event_id) {
        this.id = id;
        this.name = name;
        this.eventId = eventId != null ? eventId : event_id;
    }
}

关于java - 将所有请求参数映射到 Spring Controller 中的一个对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58932307/

相关文章:

java - 在jenkins中执行时如何动态地将参数从pom.xml传递到java类

java - maven 插件测试与 maven 3.0.4 不兼容

javascript - 如何从 jsp 中列出数据库数据并将其打印出来?

java - Autowiring 组件不直接引用

spring - 如何将文件的内容作为值传递给 Spring 属性?

java - 执行包含 java -jar Runtime.exec() 的 shell 脚本,它将使用哪个 java,操作系统级别还是应用程序级别

Java、Maven 依赖项

spring - 对多个 URL 使用 AbstractAuthenticationProcessingFilter

java - 如何在 Spring Boot 9 :30 am to 4:00 pm every 5 mins? 之间运行作业

java - 在微服务环境中,如果有多个服务以链接方式捆绑在一起,那么将如何覆盖以下场景