gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:01:04 30 4
gpt4 key购买 nike

所以,请求的 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/

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