我正在使用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”的值?
答案 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的好库