【问题标题】:Same User dto but with different JsonProperty for two services相同的用户 dto 但具有不同的 JsonProperty 用于两个服务
【发布时间】:2017-11-20 04:14:48
【问题描述】:

我有两个 Spring Rest 服务 create-employeecreate-staff 如下所示

创建员工

@RequestMapping(value="/create-employee", method = RequestMethod.POST, consumes = "application/json")
public ResponseEntity<Void> createEmployee(final @RequestBody User user) {
    try {
        // employee createion logic
    } catch (Exception exception) {
        log.error("Exception in createEmployee:"+exception.getMessage());
        return new ResponseEntity<>(HttpStatus.FORBIDDEN);
    }
}

创建员工

@RequestMapping(value="/create-staff", method = RequestMethod.POST, consumes = "application/json")
public ResponseEntity<Void> createStaff(final @RequestBody User user) {
    try {
        // staff creation logic
    } catch (Exception exception) {
        log.error("Exception in createStaff:"+exception.getMessage());
        return new ResponseEntity<>(HttpStatus.FORBIDDEN);
    }
}

对于这两个服务,我都使用了一个名为 User 的 dto,如下所示:

public class User {
    @JsonProperty("employeeName")
    private String name;

    @JsonProperty("age")
    private Integer age;

    @JsonProperty("managerName")
    private String headName;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getHeadName() {
        return headName;
    }

    public void setHeadName(String headName) {
        this.headName = headName;
    }
}

现在的问题是 create-employeecreate-staff 因为我使用 User.java 作为请求正文。发布的 json 正文是这样的

{
 "employeeName" : "string",
 "age" : "integer",
 "managerName" : "string"
}

但实际上我想要的是 create-staff 服务我希望 json 主体如下

{
 "staffName" : "string",
 "age" : "integer",
 "managerName" : "string"
}

create-staff 服务我希望 json 正文如下

{
 "employeeName" : "string",
 "age" : "integer",
 "managerName" : "string"
}

但是对于这两个服务,我需要使用相同的 User.java dto,但对于这两个服务使用不同的 JsonProperty

谁能帮我解决这个问题

【问题讨论】:

  • 如果您只使用name 并消除了这样做的任何需要怎么办?
  • @NickPredey 你是对的,但实际上这是客户要求,不仅有这么多其他服务有类似的场景。想知道是否有任何方法可以有条件地更改员工和员工的 json 属性。
  • @AlexMan :您正试图通过强制使用 Json 概念来解决设计问题。为什么User 中没有成员属性Statut statutenum Statut{ STAFF, USER, MANAGER, ....}
  • @AlexMan 您可以在您的用户对象中添加两个属性成员并告诉杰克逊不要返回null 值。 class User { String employeeName; String staffName; ... }。看这里stackoverflow.com/questions/11757487/…

标签: java json spring rest


【解决方案1】:

Jackson 还支持 JsonAlias,这可能对您有所帮助,只需确保您将 jacskon 映射器更新到版本 2.9.1

public class User {
    @JsonAlias({"employeeName","staffName"})
    private String name;

    @JsonProperty("age")
    private Integer age;

    @JsonProperty("managerName")
    private String headName;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getHeadName() {
        return headName;
    }

    public void setHeadName(String headName) {
        this.headName = headName;
    }
}

【讨论】:

  • 你是对的,它的请求正文而不是响应。使用 JsonView 我们如何有条件地做到这一点
  • 使用JsonAlias,我们可以为@JsonAlias({ "staffName", "employeeName" }) public String name;这样的属性提供多个别名。但是我们如何动态地指定 employeeName 属性应该出现在 create-employee 服务中,staffName 属性应该出现在 create-staff 服务中。
猜你喜欢
  • 2010-11-05
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-18
相关资源
最近更新 更多