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