Резюме
Я новичок в SpringBoot.Я создал пример приложения с использованием валидатора, и он работает с жестко закодированными строками.Теперь я хочу добавить функцию i18n для проверочных сообщений, но не могу заставить ее работать, боролся в течение 3 дней.
Зависимости и окружающая среда
- ОС: Windows 10
- IDE: IntelliJ IDEA 2018.2
- Java: 1.8.0_171
- Kotlin: 1.2.71
- Gradle: 4.8
- SpringBoot: 2.0.5.RELEASE
- hibernate-validator: 6.0.9.Final
Коды
Это структура моего проекта:
+ 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)
}
Класс My Entity:
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
откат к системному языку: 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'
.
Я знаю, может быть, у меня возникла глупая проблема, но я действительно много раз пытался, не могли бы вы выяснить, в чем я не прав?Большое спасибо!