如何将包装在通用实体类型中的实体体发送到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。如何解决这个问题?

有两种方法-

  1. 将profileUpdateRequest.get((转换为其中一个Object,如果有效,那没关系,如果无效,你会得到异常,然后转换为另一个。

  2. 您的linkedHashMap将包含对象中的字段,即对于EmailPreferencesUpdateRequest,它将包含一个类似"的键;isAgreedToEmails";,使用if-else签入Map,然后使用ObjectMapper执行以下操作-

    EmailPreferencesUpdateRequestemailRequest=新ObjectMapper((.readValue(YourMap,EmailPreferencesUpdateRequest.class(;

最新更新