【发布时间】:2022-01-09 01:21:43
【问题描述】:
我有一个 Spring Boot Rest API。我想创建用户并对其电子邮件和用户名设置唯一约束。到目前为止效果很好。以下是主要的类和方法:
@Entity
@NoArgsConstructor
@Getter
@Setter
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true)
@NotNull
private String email;
@Column(unique = true)
@NotNull
private String username;
@NotNull
private String password;
public User(String email, String username, String password) {
this.email = email;
this.password = password;
this.username = username;
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SignupRequest {
@NotNull
private String email;
@NotNull
private String username;
@NotNull
private String password;
}
@CrossOrigin(value = "*")
@PostMapping("/signup")
public ResponseEntity<?> signup(@Valid @RequestBody SignupRequest signupRequest) {
signupService.signup(signupRequest);
return ResponseEntity.ok().build();
}
@Service
public class SignupServiceImpl implements SignupService {
@Override
public void signup(SignupRequest signupRequest) throws MessagingException, UnsupportedEncodingException {
User user = new User();
User user = new User(signupRequest.getEmail(), signupRequest.getUsername(), signupRequest.getPassword());
user = userRepository.save(user);
}
}
@Repository
@Component
public interface UserRepository extends CrudRepository<User, Long> {}
现在,问题是,当我使用已存在的用户名或电子邮件向该端点发送 POST 请求时,我只会收到 http 响应 500 Internal Server Error。但我想返回一个不同的状态码和一些错误消息,表明电子邮件/用户名已经存在。
现在有两个问题:
- 如何全局修改响应?我可以用 try catch 块包围
userRepository.save(user)方法,但我必须在我单独保存用户的所有方法中这样做。我可以在全球范围内定义类似的东西吗? -
userRepository.save(user)方法只返回一个。JdbcSQLIntegrityConstraintViolationException带有非常冗长的消息。有没有办法清楚地确定到底出了什么问题(唯一用户名约束失败,唯一电子邮件约束失败,......)?我可以通过在 userRepository 中编写一个方法来检查具有该用户名或电子邮件的用户是否存在,但这对我来说看起来像是很多不必要的 sql 查询。有没有更好的方法?
【问题讨论】:
标签: spring-boot rest