【问题标题】:Updating Field given in request in java更新java中请求中给出的字段
【发布时间】:2020-08-10 16:29:12
【问题描述】:

我有一个表 mytable(a int ,b int ,c varchar)。 用户可以发送请求

PUT  myapi/mytable/{id}
Request body : {'a':1}

PUT  myapi/mytable/{id}
Request body : {'b':2}

PUT  myapi/mytable/{id}
Request body : {'c':"hello"}

如何编写这个单一的通用更新 API 来更新请求中指定的字段以及给定“id”的关联值,我尝试接收对象并选择非空字段进行更新,有没有更好的方法?

【问题讨论】:

  • 我认为接收对象并选择非空字段是一个糟糕的主意。导致原始类型无法正常工作。因为他们会有一个默认值。
  • 关于 PUT 的备注:根据RFC 7231,put 不应用于部分更新(如果它不适用于您的情况,您可以忽略此评论,但您的示例建议部分更新)。
  • @Hamza 是的,我通过制作包装对象来处理这个问题,比如,我不使用 class Mytable{Integer a;整数 b;字符串 c;}
  • @SANTHOSKUMAR 如果你找到更好的方法,请告诉我。
  • 您可以使用不为空设置的 moddelmapper

标签: java spring hibernate rest


【解决方案1】:

您可以使用ModelMapper 将您的非空唯一映射映射到实体。

  public static <T> void merge(T source, T target) {
      ModelMapper modelMapper = new ModelMapper();
      modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT).setSkipNullEnabled(true);
      modelMapper.map(source, target);
  }

【讨论】:

【解决方案2】:

只需使用 Apache BeanUtils 将您的 POJO 值复制到您的实体:

BeanUtils.copyProperties(entity, myTable, getNullPropertyNames(entity));

public static String[] getNullPropertyNames (Object source) {
    final BeanWrapper src = new BeanWrapperImpl(source);
    java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();

    Set<String> emptyNames = new HashSet<String>();
    for(java.beans.PropertyDescriptor pd : pds) {
        Object srcValue = src.getPropertyValue(pd.getName());
        if (srcValue == null) emptyNames.add(pd.getName());
    }
    String[] result = new String[emptyNames.size()];
    return emptyNames.toArray(result);
}

copyProperties 方法接受第三个参数作为要省略的属性名称。

【讨论】:

  • 这将使 myTable 的字段为 NULL,但响应中给出的字段除外
  • @SANTHOSKUMAR 对,我已经为我的答案添加了一个修复程序。
猜你喜欢
  • 1970-01-01
  • 2020-03-24
  • 2021-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-07
  • 2022-08-24
  • 1970-01-01
相关资源
最近更新 更多