我正在创建一个更新API来更新超级管理员的配置文件,我将成员表映射到一个DTO,在成员表密码被设置为null,并且我没有在dto上包含密码字段,因为我在控制台上返回的postman上测试API时,有这样的规定
DataIntegrityViolationException
SQL Error: 1048, SQLState: 23000
Column 'password' cannot be null这是我的密码
Dto
@Getter
@Setter
public class UpdateProfileDto {
@NotNull(message = "{member.firstName.notNull}")
@JsonProperty("first_name")
private String firstName;
@NotNull(message = "{member.lastName.notNull}")
@JsonProperty("last_name")
private String lastName;
@JsonProperty("nationality")
private Long nationality;
@JsonProperty("country_of_residence")
private Long countryOfResidence;
@JsonProperty("date_of_birth")
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
@JsonFormat(pattern = "dd-MM-yyyy")
@Past(message = "{customer.dateOfBirth.past}")
private Date dateOfBirth;
@JsonProperty("current_job_title")
private String currentJobTitle;
@NotNull(message = "{member.emailAddress.notNull}")
@JsonProperty("email_address")
private String emailAddress;
@JsonProperty("username")
private String username;
@NotNull(message = "{member.phoneNumber.notNull}")
@PhoneNumber
@JsonProperty("phone_number")
private String phoneNumber;
@Size(max = 300, message = "{member.city.size}")
@JsonProperty("city")
private String city;
@Size(max = 300, message = "{member.state.size}")
@JsonProperty("state")
private String state;
}ServiceImpl
@Override
@Transactional
public Member updateProfile(UpdateProfileDto body) {
Member superAdmin = repository.getOne(id);
if (superAdmin == null) {
throw new MemberNotFoundException(id);
}
Optional<Role> existingRole = roleJpaRepository.findByCode(RoleType.SUPER_ADMINISTRATOR.getValue());
if (existingRole.isEmpty()) {
throw new RoleNotFoundException(RoleType.SUPER_ADMINISTRATOR.getValue());
}
Member existing;
existing = mapper.map(body, Member.class);
existing.setPassword(superAdmin.getPassword());
existing.getRoles().add(existingRole.get());
existing.setNationality(countryRepository.getOne(body.getNationality()));
existing.setCountryOfResidence(countryRepository.getOne(body.getCountryOfResidence()));
return adminJpaRepository.save(existing);
}控制器
@RestController
@RequestMapping(
value = "super-admin",
produces = { MediaType.APPLICATION_JSON_VALUE }
)
public class SuperAdminController {
private final SuperAdminService service;
public SuperAdminController(SuperAdminService service) {
this.service = service;
}
@PutMapping("/update")
public Member updateProfile(@Valid @RequestBody UpdateProfileDto body){
Member superAdmin = service.updateProfile(body);
return superAdmin;
}
}密码错误已经修复(反映在serviceImpl中的更改),但是当我运行它返回Duplicate entry 'ijava@gmail.com-111803918380' for key 'member.email_address_phone_number_uq'电子邮件的代码时,电话号码被设置为成员表中的唯一约束,我如何绕过这个限制呢?
发布于 2022-12-03 08:29:43
您没有多少选择,取决于您的确切用例。
UpdateProfileDto中的唯一属性,电子邮件看起来可以完成任务。伪码:
Member existing = repository.findByEmail;
Member superAdmin = mapper.map(body, Member.class);
superAdmin.setPassword(existing.getPassword());superAdmin.setPassword("dummy-password");https://stackoverflow.com/questions/74663992
复制相似问题