SpringBoot I18N: MessageResource, кажется, не распознает мои пакеты? - PullRequest
0 голосов
/ 04 октября 2018

Резюме

Я новичок в 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'.

Я знаю, может быть, у меня возникла глупая проблема, но я действительно много раз пытался, не могли бы вы выяснить, в чем я не прав?Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...