繁体   English   中英

如何将包裹在通用实体类型中的实体主体发送到 Spring API

[英]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种方式——

  1. 如果工作正常,则将 profileUpdateRequest.get() 转换为 Object 之一,否则您将收到异常,然后转换为另一个。

  2. 您的linkedHashMap 将包含对象中的字段,即对于EmailPreferencesUpdateRequest,它将包含一个像“isAgreedToEmails”这样的键,使用if else 检查映射,然后使用ObjectMapper 执行以下操作-

    EmailPreferencesUpdateRequest emailRequest = new ObjectMapper().readValue(YourMap, EmailPreferencesUpdateRequest.class);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM