首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >更新用户详细信息api返回DataIntegrityViolationException

更新用户详细信息api返回DataIntegrityViolationException
EN

Stack Overflow用户
提问于 2022-12-03 04:29:55
回答 1查看 22关注 0票数 0

我正在创建一个更新API来更新超级管理员的配置文件,我将成员表映射到一个DTO,在成员表密码被设置为null,并且我没有在dto上包含密码字段,因为我在控制台上返回的postman上测试API时,有这样的规定

代码语言:javascript
复制
DataIntegrityViolationException
SQL Error: 1048, SQLState: 23000
Column 'password' cannot be null

这是我的密码

Dto

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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);
    }

控制器

代码语言:javascript
复制
@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'电子邮件的代码时,电话号码被设置为成员表中的唯一约束,我如何绕过这个限制呢?

EN

回答 1

Stack Overflow用户

发布于 2022-12-03 08:29:43

您没有多少选择,取决于您的确切用例。

  1. 提取现有密码,使用UpdateProfileDto中的唯一属性,电子邮件看起来可以完成任务。

伪码:

代码语言:javascript
复制
Member existing = repository.findByEmail;
Member superAdmin = mapper.map(body, Member.class);
superAdmin.setPassword(existing.getPassword());

  1. 为密码设置了一个虚拟值,将在稍后更新.

代码语言:javascript
复制
superAdmin.setPassword("dummy-password");

  1. 使该列在数据库中为空。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74663992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档