![](/img/trans.png)
[英]How to send extra fields with an entity object in request body spring mvc?
[英]How to send entity body wrapped in a generic entity type to an Spring API
我有几个子实体要发送到具有单独 API 请求的单个 API 端点,因此我将它们包装在父实体中并按如下方式发送。
主要包装类
@Getter
@Setter
public class ProfileUpdateRequest<T> {
private T t;
public void add(T t) {
this.t = t;
}
public T get() {
return t;
}
}
@Getter
@Setter
public class EmailPreferencesUpdateRequest {
@JsonProperty
private boolean isAgreedToEmails;
}
@Getter
@Setter
public class AddressUpdateRequest {
private List<UserAddress> addresses;
}
发送更新电子邮件首选项请求
@RequestMapping(value = "/update-email", method = RequestMethod.POST, headers = "Accept=*/*", produces = "application/json")
@ResponseBody
public String updateEmailNotificationPreferences(@RequestBody EmailPreferencesUpdateRequest emailPreferencesUpdateRequest,
HttpServletRequest request) {
ProfileUpdateRequest<EmailPreferencesUpdateRequest> updateRequest = new ProfileUpdateRequest<>();
updateRequest.add(emailPreferencesUpdateRequest);
UriComponents uri = UriComponentsBuilder
.fromHttpUrl(baseUrl + "/user/update")
.build();
String urlString = uri.toUriString();
HttpHeaders requestHeaders = new HttpHeaders();
RestTemplate restTemplate = new RestTemplate();
HttpEntity<ProfileUpdateRequest> requestWithHeader = new HttpEntity<>(updateRequest, requestHeaders);
restTemplate.exchange(urlString, HttpMethod.PUT, requestWithHeader, UserEntry.class);
return "success";
}
发送更新地址请求
@RequestMapping(value = "/update-addresses", method = RequestMethod.POST, headers = "Accept=*/*", produces = "application/json")
@ResponseBody
public String updateAddresses(@RequestBody List<UserAddress> userAddresses, HttpServletRequest request) {
AddressUpdateRequest addressUpdateRequest = new AddressUpdateRequest();
addressUpdateRequest.setAddresses(userAddresses);
ProfileUpdateRequest<AddressUpdateRequest> updateRequest = new ProfileUpdateRequest<>();
updateRequest.add(addressUpdateRequest);
UriComponents uri = UriComponentsBuilder
.fromHttpUrl(baseUrl + "/user/update")
.build();
String urlString = uri.toUriString();
HttpHeaders requestHeaders = new HttpHeaders();
RestTemplate restTemplate = new RestTemplate();
HttpEntity<ProfileUpdateRequest> requestWithHeader = new HttpEntity<>(updateRequest, requestHeaders);
restTemplate.exchange(urlString, HttpMethod.PUT, requestWithHeader, UserEntry.class);
return "success";
}
API 端点
@Path("/user/update")
@PUT
public UserEntry updateUser(ProfileUpdateRequest profileUpdateRequest) {
if (profileUpdateRequest.get() instanceof AddressUpdateRequest) {
// update addresses
} else if (profileUpdateRequest.get() instanceof EmailPreferencesUpdateRequest) {
// update emails
}
}
从端点,我需要获取ProfileUpdateRequest
类型中的实体,并检查实例我包装的实体类型,以便我可以传递给相关操作。 但我把它当作一个 LinkedHashMap。 如何解决这个问题?
有2种方式——
如果工作正常,则将 profileUpdateRequest.get() 转换为 Object 之一,否则您将收到异常,然后转换为另一个。
您的linkedHashMap 将包含对象中的字段,即对于EmailPreferencesUpdateRequest,它将包含一个像“isAgreedToEmails”这样的键,使用if else 检查映射,然后使用ObjectMapper 执行以下操作-
EmailPreferencesUpdateRequest emailRequest = new ObjectMapper().readValue(YourMap, EmailPreferencesUpdateRequest.class);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.