SpringBoot I18N:MessageResource似乎无法识别我的捆绑包?

时间:2018-10-04 09:00:42

标签: java spring-boot kotlin internationalization hibernate-validator

摘要

我是SpringBoot的新手。我已经使用验证器创建了一个示例应用程序,它可以与硬编码字符串一起使用。现在,我想为验证消息添加i18n功能,但是经过3天的苦苦挣扎,我却无法正常工作。

依赖关系和环境

  • 操作系统:Windows 10
  • IDE:IntelliJ IDEA 2018.2
  • Java:1.8.0_171
  • 科特琳:1.2.71
  • 等级:4.8
  • SpringBoot:2.0.5.RELEASE
  • 休眠验证器: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)
}

我的实体类:

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 i18nSpringBoot validation等,很多结果都是关于thymeleaf的,但我认为这个问题与此无关。
  • 尝试使用其他MessageSource实现:ResourceBundleMessageSourceReloadableResourceBundleMessageSource,无效;
  • 将以下内容添加或删除到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'抛出一个异常。

我知道也许我遇到了一个愚蠢的问题,但是我确实尝试了很多次,请您找出我哪里错了吗?非常感谢!

0 个答案:

没有答案