我是SpringBoot的新手。我已经使用验证器创建了一个示例应用程序,它可以与硬编码字符串一起使用。现在,我想为验证消息添加i18n功能,但是经过3天的苦苦挣扎,我却无法正常工作。
这是我的项目结构:
+ src/main
+ kotlin
+ com.example
- Application.kt
+ (otherclasses/packages)
+ resources
- application.yml
+ i18n
- messages.properties
- messages_zh_CN.properties
这是我的应用程序(我使用Kotlin语言):
package com.example
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Bean
import org.springframework.context.support.ReloadableResourceBundleMessageSource
import org.springframework.validation.com.example
import org.springframework.validation.beanvalidation.Localcom.exampleFactoryBean
@SpringBootApplication
open class AthenaApplication {
@Bean
open fun messageSource(): ReloadableResourceBundleMessageSource {
return ReloadableResourceBundleMessageSource().apply {
setDefaultEncoding("UTF-8")
setBasename("i18n/messages")
}
}
@Bean
open fun validator(): Validator {
return LocalValidatorFactoryBean().apply {
setValidationMessageSource(messageSource())
}
}
}
fun main(args: Array<String>) {
runApplication<AthenaApplication>(*args)
}
我的实体类:
package com.example.domain
import com.example.util.validation.ExactlyDigit
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.Id
import javax.validation.constraints.*
@Entity
data class AppVersionEntity(
@Id
@field:Column(nullable = false)
@field:ExactlyDigit(digit = 8, message = "versionCode {validation.exactly.digit}")
val versionCode: Int = 0,
@Column(nullable = false)
@field:NotEmpty(message = "versionName {javax.validation.constraints.NotEmpty.message}")
val versionName: String = "")
ExactlyDigit
是自定义验证程序,如NotEmpty
。使用硬编码的字符串和javax i18n消息时,它可以按预期工作。
我的控制器:
package com.example.controller.system
import com.example.base.AthenaResponse
import com.example.domain.AppVersionEntity
import com.example.service.VersionRepository
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.data.domain.Sort
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
import javax.validation.Valid
@RestController
open class AppVersionController {
@RequestMapping("system/createAppVersion")
fun postNewVersion(@Valid @RequestBody entity: AppVersionEntity): AthenaResponse<Any> {
versionRepository.save(entity)
return AthenaResponse()
}
}
我的 messages.properties :
validation.exactly.digit=Must be 8 chars
messages_zh_CN.properties :
validation.exactly.digit=必须为8位数字
还有我的application.yml
:
spring:
datasource:
url: jdbc:mysql://localhost/xxx?useSSL=false
username: xxx
password: xxx
driver-class-name: com.mysql.jdbc.Driver
jpa:
properties:
hibernate.hbm2ddl.auto: update
hibernate.dialect: org.hibernate.dialect.MySQL8Dialect
show-sql: true
SpringBoot i18n
,SpringBoot validation
等,很多结果都是关于thymeleaf
的,但我认为这个问题与此无关。MessageSource
实现:ResourceBundleMessageSource
,ReloadableResourceBundleMessageSource
,无效; 将以下内容添加或删除到application.yml
中,或将其保留在application.yml
中,并删除validator()
中的messageSource()
/ Application.kt
,但无效,似乎没有效果:
消息:
基本名称:i18n / messages
快取秒数:60
fallback-to-system-locale:true
编码:UTF-8
删除i18n
文件夹并将messages(_zh_CN).properties
文件移动到resources
文件夹中,更新相应的配置,不起作用;
在ExceptionHandler中添加记录器,如下所示:
logger.error(messageSource.getMessage(“ validation.exactly.digit”,null,LocaleContextHolder.getLocale()))
No message found under code 'validation.exactly.digit' for locale 'zh_CN'
抛出一个异常。
我知道也许我遇到了一个愚蠢的问题,但是我确实尝试了很多次,请您找出我哪里错了吗?非常感谢!