【问题标题】:How to initialize a MessageSource to inject into controller?如何初始化 MessageSource 以注入控制器?
【发布时间】:2019-08-19 09:02:13
【问题描述】:

我搜索了大半个互联网,但没有找到明确的答案......

我想做简单的事情:就像在 Grails 中有一个 MessageSource 类型的单例,在控制器中使用它来显示 i18n 消息。

我想从这个文件初始化我的messageSource

src/main/resources/my/package/i18n/Messages*.properties

test=FooBar

初始化尝试:

class AppConfig {

  @Singleton
  MessageSource messageSource() {
    new ResourceBundleMessageSource( 'my.package.i18n.Messages' )
  }

}

要注入的控制器:

class CRUDController<T> {

  @Inject
  MessageSource messageSource

  @Transactional( readOnly=true )
  @Get( '/' )
  Map<String,Object> list() {
    log.info "$messageSource -> ${messageSource.getMessage( 'test', MessageSource.MessageContext.DEFAULT )}"
    [:]
  }

}

日志信息打印如下:

io.micronaut.runtime.context.CompositeMessageSource@79a1d030 -> Optional.empty

所以,messageSource 以某种方式(和某处)错误初始化。

做这件简单事情的最简单直接的方法是什么?

【问题讨论】:

  • 与您的问题无关,但私有构造函数是多余的。
  • 即使你删除了私有构造函数,你也会拥有它。您有另一个构造函数的事实会阻止生成无参数构造函数。
  • 我已将您的代码粘贴到新创建的 1.2 应用程序中,但无法重现该行为。如果您可以指出一个演示问题的示例应用程序,那么诊断将更容易。
  • @JeffScottBrown 你能粘贴或指向我messageSource的初始化代码吗?
  • "你能粘贴或指向messageSource的初始化代码吗" - 这正是你所拥有的......@Inject MessageSource messageSource

标签: java groovy dependency-injection internationalization micronaut


【解决方案1】:

https://github.com/jeffbrown/injecteermessagesource查看项目。

https://github.com/jeffbrown/injecteermessagesource/blob/beba0773d41cb475d8d837acc19d0dd41f5b4431/src/main/groovy/injecteermessagesource/CRUDController.groovy

package injecteermessagesource

import io.micronaut.context.MessageSource

import javax.inject.Inject

class CRUDController<T> {

    protected final Class<T> clazz

    @Inject
    MessageSource messageSource

    protected CRUDController( Class<T> clazz ) {
        this.clazz = clazz
    }

}

https://github.com/jeffbrown/injecteermessagesource/blob/471f6436511c99511426094a8c269112e93149e6/src/main/groovy/injecteermessagesource/PersonController.groovy

package injecteermessagesource

import io.micronaut.context.MessageSource
import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get

@Controller('/people')
class PersonController  extends CRUDController<Person> {
    protected PersonController() {
        super(Person)
    }

    @Get('/')
    String index() {
        def context = MessageSource.MessageContext.DEFAULT
        def message = messageSource.getMessage('test', context)
        message.get()
    }
}

https://github.com/jeffbrown/injecteermessagesource/blob/471f6436511c99511426094a8c269112e93149e6/src/main/groovy/injecteermessagesource/AppConfig.groovy

package injecteermessagesource

import io.micronaut.context.MessageSource
import io.micronaut.context.annotation.Bean
import io.micronaut.context.annotation.Factory
import io.micronaut.context.i18n.ResourceBundleMessageSource

@Factory
class AppConfig {

    @Bean
    MessageSource messageSource() {
        new ResourceBundleMessageSource('my.somepackage.i18n.Messages')
    }
}

https://github.com/jeffbrown/injecteermessagesource/blob/471f6436511c99511426094a8c269112e93149e6/src/main/resources/my/somepackage/i18n/Messages.properties

test=FooBar

似乎一切正常:

$ curl localhost:8080/people
FooBar

【讨论】:

  • 我只缺少@Factory/@Bean 组合
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多