在rest中用java中相同类型的另一个对象更新对象的最佳方法

在rest中用java中相同类型的另一个对象更新对象的最佳方法,java,rest,Java,Rest,我在设计RESTAPI时提出了这个问题 要更新资源,客户端必须提交整个资源以及更新的字段。问题是并非所有字段都是可编辑的。如果客户机发送一个资源,其中包含他不应该更新的更新字段,该怎么办?我应该抛出某种异常还是忽略它们并更新所有可编辑字段? 我提出了以下解决方案 class User { private String firstName; //non-editable private String lastName; //non-editable private Str

我在设计RESTAPI时提出了这个问题

要更新资源,客户端必须提交整个资源以及更新的字段。问题是并非所有字段都是可编辑的。如果客户机发送一个资源,其中包含他不应该更新的更新字段,该怎么办?我应该抛出某种异常还是忽略它们并更新所有可编辑字段? 我提出了以下解决方案

class User {

    private String firstName; //non-editable
    private String lastName; //non-editable
    private String occupation; //editable
    private String address; //editable

    //getters and setters
}


我在这里看到的问题是updateUser方法与User类紧密耦合。如果我添加或删除可编辑/不可编辑字段,我将始终必须更改方法。是否存在解决此类问题的最佳实践或模式

用户的静态方法将正确封装此功能。这样,您就可以将所有特定于用户的代码放在一起

    class User {

      private String firstName; //non-editable
      private String lastName; //non-editable
      private String occupation; //editable
      private String address; //editable

      static public void updateUser(User original, User update) {
        original.setAddress(update.getAddress());
        original.setOccupation(update.getOccupation());
      }
    }

另外,如果您非常关心firstName/lastName在创建后不被更改,我会确保根本不包括它们的setter。

作为API的用户,我想知道何时编辑不可编辑的值,因为这可能意味着我的代码中有一个bug,或者我误解了API的功能。在任何一种情况下,我都希望在过程中尽早发现这一点,因此我更希望通过响应中的错误代码看到异常,而不是那些对我来说似乎是成功的但实际上并没有做我认为它做了的事情

也就是说,这取决于具体的用例。很难说没有更多关于API如何使用的细节。只更新可编辑字段可能更有意义,只需在API文档中明确说明即可


正如coderkevin已经指出的,在用户类上使用静态方法将是放置实际执行更新的代码的合适位置。

将值设置为
null
是否会被视为对您的编辑?很多人可能更喜欢在从头开始创建json时这样做,而不是弄清楚当前的其他字段。此外,我认为编程stackexchange可能比stackoverflow更了解这个问题。这是一个很好的观点,在实践中,如果有人修改了不应该修改的值,我会添加异常或返回验证错误。
    class User {

      private String firstName; //non-editable
      private String lastName; //non-editable
      private String occupation; //editable
      private String address; //editable

      static public void updateUser(User original, User update) {
        original.setAddress(update.getAddress());
        original.setOccupation(update.getOccupation());
      }
    }