gpt4 book ai didi

java - 如何访问 @ApplicationScoped Bean 中的资源包

转载 作者:太空宇宙 更新时间:2023-11-04 09:30:50 26 4
gpt4 key购买 nike

我有一个服务器端事件,并在 @MessageDriven bean 中接收一个对象,然后调用 @ApplicationScoped bean 中的一个方法以在已知区域设置中准备电子邮件。我需要资源包中的条目来准备动态消息(许多翻译的错误消息,语言在消息对象中编码)。

我尝试构建一个消息提供程序:

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import javax.inject.Qualifier;

@Qualifier
@Documented
@Retention(RUNTIME)
@Target({ TYPE, FIELD, METHOD, PARAMETER })
public @interface MessageBundle {

}

提供者:

import java.util.MissingResourceException;
import java.util.ResourceBundle;

import javax.enterprise.inject.Produces;
import javax.inject.Named;

@Named
public class MessageProvider {

private ResourceBundle bundle;

public MessageProvider() {
this.bundle = null;
}



@Produces @MessageBundle
public ResourceBundle getBundle() {
if (bundle == null) {
FacesContext context = FacesContext.getCurrentInstance();
bundle = context.getApplication()
.getResourceBundle(context, "msgs");
}
return bundle;
}
}

我这样调用它(简化):

@Named
@ApplicationScoped
public class SmtpSenderBean {

@EJB
private SendMail sendmail;

@Inject @MessageBundle
private ResourceBundle bundle;

public void send(Email mail, int errorCode){
String subjectMsg = bundle.getString("event.smtp.subject");
String bodyMsg = bundle.getString("event.smtp.body");
mail.setSubject(MessageFormat.format(subjectMsg, errorCode));
mail.setBody(MessageFormat.format(bodyMsg, errorCode))
sendmail.send(mail);
}
}

FacesContext 始终为 null,因为该 bean 不是由 jsf 触发的。该对象作为服务器端事件通过 JMS 接收。我没有发现任何关于这个问题的信息。在 CDI 中访问 @ApplicationScoped bean 中的资源包的首选方式是什么?

最佳答案

我通过直接访问资源包解决了这个问题。我认为这是最佳实践,因为我没有找到该特殊情况的示例/文档:

@Produces @MessageBundle
public ResourceBundle getBundle() {
if (bundle == null) {
bundle = ResourceBundle.getBundle("com.example.msgs");
}
return bundle;
}

关于java - 如何访问 @ApplicationScoped Bean 中的资源包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57119781/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com