为hibernate中的唯一约束添加自定义消息
我有message.properties文件,它工作正常为hibernate中的唯一约束添加自定义消息,hibernate,spring-mvc,Hibernate,Spring Mvc,我有message.properties文件,它工作正常 @Entity @Table(name="users",uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})}) public class User implements Serializable { @Column(unique = true,name = "email") @NotNull(message = "{NotNull.email}")
@Entity @Table(name="users",uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})})
public class User implements Serializable {
@Column(unique = true,name = "email")
@NotNull(message = "{NotNull.email}")
@Email(message = "{Pattern.email}")
@Size(min=10, max=50)
private String email;
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
我可以在message.properties文件中添加另一个字段吗
NotNull.email = Email is required
Pattern.email = Enter a valid email address
并将此独特的.email发送给
Unique.email = Email already exits
我知道,我们不能将message=“{Unique.email}”保留在上述行中
但是,我们如何才能将“Unique.email”提供给上面的列以获取自定义错误消息呢
?
提前感谢模型User.java中的用户定义注释“@Unique”
@Column(unique = true,name = "email",message="{Unique.email}")
message.properties
@Column(unique = true,name = "email")
@Unique(message = "{Unique.email}")
private String email;
Unique.java
Unique.email = Email id already exists
UserServiceImpl.java
public interface UserService {
public boolean existsByEmail(String email,Class clazz);
}
UserRepository.java
import com.UserRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class UserServiceImpl extends UserRepository implements UserService {
@Override
public boolean existsByEmail(String email, Class clazz) {
return super.existsByEmail(email,clazz);
}
}
在用户存储库文件中
public class UserRepository {
public boolean existsByEmail(String email, Class className) {
Criteria criteria = getSession().createCriteria(className,"userEmail");
criteria.add(Restrictions.eq("email",email));
if(criteria.list().size() == 0){
return false;
}
return true;
}
}
我解决了类似的问题,在春季开机,我希望它将帮助美国
@Autowired
private UserRepository userRepository;
if(userRepository.existsByEmail(pass_email_HERE)) {
throw new YourCustomExceptionException("CUSTOM_ERROR_MESSAGE");
}
@ControllerAdvice
公共类ControllerExceptionHandler扩展了ResponseEntityExceptionHandler{
@ExceptionHandler(值={DataIntegrityViolationException.class})
受保护的响应handleConflict(DataIntegrityViolationException ex,WebRequest){
JSONObject结果=新建JSONObject();
result.appendField(“result”,false);
字符串errorMessage=“”;
org.hibernate.exception.ConstraintViolationException exDetail=
(org.hibernate.exception.ConstraintViolationException)ex.getCause();
errorMessage=fieldCnvrt(exDetail.getConstraintName())+“birden fazla aynıdeğer içeremez!”;
结果。追加字段(“消息”,errorMessage);
返回响应状态(HttpStatus.不可接受)。正文(结果);
}
专用字符串字段CNVRT(字符串字段){
开关(现场){
案例“用户名”:
field=“KullanıcıAdı”;
打破
案例“电子邮件”:
field=“电子邮件”;
打破
案例“短名称”:
field=“KısaltımıAd”;
打破
案例“名称”:
field=“Ad”;
打破
}
返回字段;
}
}对于此解决方案,必须在数据库中使用“查找”,这是错误的@saeedeh您如何避免“查找”用于此解决方案?@Semantic我如何才能将此注释用于更多表?是否需要为所有验证器创建单独的实现?@Semantic此实现也会在更新记录时引发验证错误。如何解决这个问题?
public class UserRepository {
public boolean existsByEmail(String email, Class className) {
Criteria criteria = getSession().createCriteria(className,"userEmail");
criteria.add(Restrictions.eq("email",email));
if(criteria.list().size() == 0){
return false;
}
return true;
}
}
public interface UserRepository extends JpaRepository<User, Long> {
Boolean existsByEmail(String email);
}
@Autowired
private UserRepository userRepository;
if(userRepository.existsByEmail(pass_email_HERE)) {
throw new YourCustomExceptionException("CUSTOM_ERROR_MESSAGE");
}
@ControllerAdvice
public class ControllerExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(value = {DataIntegrityViolationException.class})
protected ResponseEntity<JSONObject> handleConflict(DataIntegrityViolationException ex, WebRequest request) {
JSONObject result = new JSONObject();
result.appendField("result", false);
String errorMessage = "";
org.hibernate.exception.ConstraintViolationException exDetail =
(org.hibernate.exception.ConstraintViolationException) ex.getCause();
errorMessage = fieldCnvrt(exDetail.getConstraintName()) + " birden fazla aynı değer içeremez!";
result.appendField("message", errorMessage);
return ResponseEntity.status(HttpStatus.NOT_ACCEPTABLE).body(result);
}
private String fieldCnvrt(String field) {
switch (field) {
case "username":
field = "Kullanıcı Adı";
break;
case "email":
field = "Email";
break;
case "short_name":
field = "Kısaltımış Ad";
break;
case "name":
field = "Ad";
break;
}
return field;
}