如何访问String json有效负载并将其映射到Spring Rest控制器中的对象?

时间:2018-09-19 21:40:00

标签: java spring rest jackson

我正在使用Spring Boot Rest服务构建一个Rest API。 我有一个Java类:

class Person{
 int id;
 @notNull
 String name;
 @notNull
 String password;
 }

我想创建一个API以创建一个Person对象。我将收到带有json正文的POST请求,例如:

{
"name":"Ahmad",
"password":"myPass",
"shouldSendEmail":1
}

如您所见,还有一个额外的字段“ shouldSendEmail”,我必须使用它来了解在创建Person对象后是否应该发送电子邮件。 我正在使用以下API:

@RequestMapping(value = "/AddPerson", method = RequestMethod.POST)
public String savePerson(
        @Valid @RequestBody Person person) {

     personRepository.insert(person);

    // Here I want to know if I should send an email or Not

    return "success";
}

以这种方式使用自动映射时,是否可以访问“ shouldSendEmail”的值?

4 个答案:

答案 0 :(得分:0)

您将需要一个中间DTO,否则您将必须修改人员以包含shouldSendEmail的字段。如果那是不可能的,唯一的替代方法是使用JsonNode并从树中手动选择属性。

例如,

@Getter
public class PersonDTO {
    private final String name;
    private final String password;
    private final Integer shouldSendEmail;

    @JsonCreator
    public PersonDTO(
        @JsonProperty("name") final String name,
        @JsonProperty("password") final String password,
        @JsonProperty("shouldSendEmail") final Integer shouldSendEmail
    ) {
        this.name = name;
        this.password = password;
        this.shouldSendEmail = shouldSendEmail;
    }
}

答案 1 :(得分:0)

您可以按以下方式同时使用@RequestBody和@RequestParam

... / addPerson?sendEmail = true

因此,将“ sendEmail”值作为请求参数发送,将人作为请求正文发送

Spring MVC - Why not able to use @RequestBody and @RequestParam together

答案 2 :(得分:0)

您有多种解决方案

1-您可以在此属性上方放置@Column(insertable = false,updatable = false)

2-将其作为请求参数@RequestParam发送 @RequestMapping(值=“ / AddPerson”,方法= RequestMethod.POST) 公共字符串savePerson(         @Valid @RequestBody Person person person,@ RequestParam boolean sendMail){}

3-使用DTO可以说出PersonModel并在保存之前将其映射到Person

答案 3 :(得分:0)

有许多选项可以解决。由于您不想保留shouldSendEmail标志,并且可以将它添加到域类中,因此可以使用@Transient批注告诉JPA跳过持久性。

@Entity
public class Person {

    @Id 
    private Integer id;

    @NotNull
    private String name;

    @NotNull
    private String password;

    @Transient
    private Boolean shouldSendEmail;

}

如果您想要更灵活的实体个性化设置,我建议使用DTO。

MapStruct是处理DTO的好库