如何初始化 MessageSource 以注入控制器?
How to initialize a MessageSource to inject into controller?
我搜索了大半个互联网,但没有找到明确的答案...
我想做一件简单的事情:就像在 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 以某种方式(和某处)被错误初始化。
做这个简单的事情最简单直接的方法是什么?
在 https://github.com/jeffbrown/injecteermessagesource 查看项目。
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
}
}
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()
}
}
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')
}
}
test=FooBar
一切似乎都有效:
$ curl localhost:8080/people
FooBar
我搜索了大半个互联网,但没有找到明确的答案...
我想做一件简单的事情:就像在 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 以某种方式(和某处)被错误初始化。
做这个简单的事情最简单直接的方法是什么?
在 https://github.com/jeffbrown/injecteermessagesource 查看项目。
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
}
}
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()
}
}
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')
}
}
test=FooBar
一切似乎都有效:
$ curl localhost:8080/people
FooBar