I18n 用于自定义错误消息到 JPA 实体中

Posted

技术标签:

【中文标题】I18n 用于自定义错误消息到 JPA 实体中【英文标题】:I18n for custom error messages into JPA entity 【发布时间】:2020-04-25 02:31:31 【问题描述】:

我希望了解如何将 JPA 实体错误消息国际化。我了解它如何使用自动装配的 MessageSource 在控制器中工作,但就我而言,我想在 JPA 实体中执行此操作。我对使用与控制器问题相同的方式并不感兴趣,因为我认为没有针对在该实体上自动装配完整的 MessageSource 进行优化。如果有人有一个简单的例子来向我展示它如何与像我这样的简单实体一起工作。我的项目使用 spring-boot 2.2 ; JPA ;和百里香。

我使用的实体:

package com.bananasplit.weblab2.entities;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;

@Entity
@Table(name = "todo")
public class Todo 
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Column(name = "name", nullable = false)
    @NotEmpty
    @Size(min=2, max=30) // error message is already internationalized here with spring-boot
    private String name;

    @Column(name = "category", nullable = false)
    @NotEmpty
    @Pattern(regexp="(WORK|PERSONAL|SPECIAL)",
        message="Category must be WORK or PERSONNAL or SPECIAL.") // here is the message I want to internationalize
    private String category;


    public Todo() 

    public Todo(String name, String category) 
        this.name = name;
        this.category = category;
    

    @Override
    public String toString() 
        return String.format(
            "Todo[id=%d, name='%s', category='%s']",
            id, name, category);
    

    public Long getId() 
        return id;
    

    public String getName() 
        return name;
    

    public void setName(String name) 
        this.name = name;
    

    public String getCategory() 
        return category;
    

    public void setCategory(String category) 
        this.category = category;
    

【问题讨论】:

【参考方案1】:

默认情况下 Spring boot 使用这个 ValidationMessages.properties 但你可以通过在资源中添加这个文件来覆盖。

@Size(min=2, max=30, message="empty.todo.name") 
private String name;

ValidationMessages.properties 文件中

 empty.todo.name = Cannot be blank

如果您想管理 Spring 应扫描哪些包消息,则应遵循此link

【讨论】:

谢谢。正是我搜索的:)

以上是关于I18n 用于自定义错误消息到 JPA 实体中的主要内容,如果未能解决你的问题,请参考以下文章

从数据库为 JPA 实体生成自定义代码

Eclipse 中单独 JAR 中的 JPA @MappedSuperclass 导致验证错误“实体未定义主键属性”

JPA 本机查询结果集映射到具有子类的实体类

用于在 Spring Data Jpa 中从多个表中获取数据的自定义查询

Spring Boot Jpa框架自定义查询语句返回自定义实体

JPA,实体管理器,选择多列并获取结果列表自定义对象