java spring mvc @service 方法:nullpointerexception |新手和翻译
java spring mvc @service method: nullpointerexception | newbie and translation
我正在尝试建立一个将使用 gnu gettext 的翻译服务。基本思路来自:https://thedarkgod.wordpress.com/2009/01/18/java-webapp-localization-through-gettext/
但我希望它作为一项服务来实施。出于一些奇怪的原因,我想要这个 class:
import webapp.service.TranslationService;
import org.springframework.context.i18n.LocaleContextHolder;
/**
* AppStrings<p>
* <p/>
* DOC-TODO:
*/
@Service("applicationStrings")
public class ApplicationStrings {
@Autowired private TranslationService translationService;
public String CART_SUBTYPE = "Cart";
public ApplicationStrings(){
Locale locale = LocaleContextHolder.getLocale();
//translationService.initLocale();
this.updateLocale();
}
public void updateLocale(){
Locale locale = LocaleContextHolder.getLocale();
translationService.updateLocale(locale);
this.setLocale(locale);
}
public void setLocale(Locale locale){
//this.CART_SUBTYPE = translationService._("Cart");
this.CART_SUBTYPE = "CART_DEF - Check ApplicationStrings";
}
}
部分代码已注释,因为它实际上不起作用...但它可能会揭示我的目标。确实有问题的服务 class 看起来像这样:
package webapp.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import gnu.gettext.GettextResource;
import java.util.ResourceBundle;
import java.util.Locale;
import java.text.MessageFormat;
import java.util.Hashtable;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
/**
* From: https://thedarkgod.wordpress.com/2009/01/18/java-webapp-localization-through-gettext/
*
*/
@Service("translationService")
public class TranslationService {
private final Logger logger = LoggerFactory.getLogger(getClass());
private static Hashtable<Locale, ResourceBundle> trht = new Hashtable<Locale, ResourceBundle> ();
private ResourceBundle myResources = null;
public TranslationService () {
Locale locale = LocaleContextHolder.getLocale();
if ( locale == null){
logger.warn("Setting a default locale!");
locale = Locale.ENGLISH;
}
this.updateLocale(locale);
}
public TranslationService (Locale locale) {
this.updateLocale(locale);
}
public void initLocale () {
Locale locale = LocaleContextHolder.getLocale();
this.updateLocale(locale);
}
public void updateLocale(Locale locale)
{
synchronized (trht)
{
if (!trht.contains (locale))
{
try
{
myResources = GettextResource.getBundle("translation", locale);
}
catch (Exception e)
{
logger.error("UPDATE: Exception.");
e.printStackTrace();
}
trht.put ((Locale) locale.clone(), myResources);
}
else
myResources = trht.get (locale);
}
}
public String _(String s)
{
if (myResources == null) return s;
return GettextResource.gettext (myResources, s);
}
public String N_(String singular, String plural, long n)
{
if (myResources == null) return (n == 1 ? singular : plural);
return GettextResource.ngettext (myResources, singular,
plural, n);
}
public String format (String s, Object ... args)
{
return MessageFormat.format (_(s), args);
}
public String formatN (String singular, String plural,
long n, Object ... args)
{
return MessageFormat.format (N_(singular, plural, n), args);
}
}
这些class在我的应用程序中甚至没有一点使用,但是spring当然会实例化它们并且错误看起来像这样:
java.lang.NullPointerException
at webapp.constant.ApplicationStrings.updateLocale(ApplicationStrings.java:34)
at webapp.constant.ApplicationStrings.<init>(ApplicationStrings.java:29)
请注意,所有其他@service 都在工作,所以我认为这不是某些 xml 配置的问题,我在 Whosebug 上发现了一些问题(和答案),其他服务也在工作,所以配置应该没问题。
我认为这是我的新手方法,可能会遗漏一些简单的关键字..甚至概念..
感谢和欢呼
连同答案,因为这可能是 gettext 的一般方法并且确实与问题相关,我将不胜感激对实际方法的一些评论。
此外,我完全不确定 "sychronized" 部分:这会是问题所在吗?
您正在构造函数中调用依赖项。 Spring 在构造对象后连接 bean 依赖项,所以在这里您尝试过早地调用这些方法,Spring 那时没有机会连接您的 bean。要解决此问题,您可以使用 @PostConstruct
注释。 Spring 在构造和连接一个 bean 之后总是调用标有此标记的方法。
例如
public ApplicationStrings() {
}
@PostConstruct
public void init() {
//translationService.initLocale();
this.updateLocale();
}
我正在尝试建立一个将使用 gnu gettext 的翻译服务。基本思路来自:https://thedarkgod.wordpress.com/2009/01/18/java-webapp-localization-through-gettext/
但我希望它作为一项服务来实施。出于一些奇怪的原因,我想要这个 class:
import webapp.service.TranslationService;
import org.springframework.context.i18n.LocaleContextHolder;
/**
* AppStrings<p>
* <p/>
* DOC-TODO:
*/
@Service("applicationStrings")
public class ApplicationStrings {
@Autowired private TranslationService translationService;
public String CART_SUBTYPE = "Cart";
public ApplicationStrings(){
Locale locale = LocaleContextHolder.getLocale();
//translationService.initLocale();
this.updateLocale();
}
public void updateLocale(){
Locale locale = LocaleContextHolder.getLocale();
translationService.updateLocale(locale);
this.setLocale(locale);
}
public void setLocale(Locale locale){
//this.CART_SUBTYPE = translationService._("Cart");
this.CART_SUBTYPE = "CART_DEF - Check ApplicationStrings";
}
}
部分代码已注释,因为它实际上不起作用...但它可能会揭示我的目标。确实有问题的服务 class 看起来像这样:
package webapp.service;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import gnu.gettext.GettextResource;
import java.util.ResourceBundle;
import java.util.Locale;
import java.text.MessageFormat;
import java.util.Hashtable;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Service;
/**
* From: https://thedarkgod.wordpress.com/2009/01/18/java-webapp-localization-through-gettext/
*
*/
@Service("translationService")
public class TranslationService {
private final Logger logger = LoggerFactory.getLogger(getClass());
private static Hashtable<Locale, ResourceBundle> trht = new Hashtable<Locale, ResourceBundle> ();
private ResourceBundle myResources = null;
public TranslationService () {
Locale locale = LocaleContextHolder.getLocale();
if ( locale == null){
logger.warn("Setting a default locale!");
locale = Locale.ENGLISH;
}
this.updateLocale(locale);
}
public TranslationService (Locale locale) {
this.updateLocale(locale);
}
public void initLocale () {
Locale locale = LocaleContextHolder.getLocale();
this.updateLocale(locale);
}
public void updateLocale(Locale locale)
{
synchronized (trht)
{
if (!trht.contains (locale))
{
try
{
myResources = GettextResource.getBundle("translation", locale);
}
catch (Exception e)
{
logger.error("UPDATE: Exception.");
e.printStackTrace();
}
trht.put ((Locale) locale.clone(), myResources);
}
else
myResources = trht.get (locale);
}
}
public String _(String s)
{
if (myResources == null) return s;
return GettextResource.gettext (myResources, s);
}
public String N_(String singular, String plural, long n)
{
if (myResources == null) return (n == 1 ? singular : plural);
return GettextResource.ngettext (myResources, singular,
plural, n);
}
public String format (String s, Object ... args)
{
return MessageFormat.format (_(s), args);
}
public String formatN (String singular, String plural,
long n, Object ... args)
{
return MessageFormat.format (N_(singular, plural, n), args);
}
}
这些class在我的应用程序中甚至没有一点使用,但是spring当然会实例化它们并且错误看起来像这样:
java.lang.NullPointerException
at webapp.constant.ApplicationStrings.updateLocale(ApplicationStrings.java:34)
at webapp.constant.ApplicationStrings.<init>(ApplicationStrings.java:29)
请注意,所有其他@service 都在工作,所以我认为这不是某些 xml 配置的问题,我在 Whosebug 上发现了一些问题(和答案),其他服务也在工作,所以配置应该没问题。
我认为这是我的新手方法,可能会遗漏一些简单的关键字..甚至概念..
感谢和欢呼
连同答案,因为这可能是 gettext 的一般方法并且确实与问题相关,我将不胜感激对实际方法的一些评论。
此外,我完全不确定 "sychronized" 部分:这会是问题所在吗?
您正在构造函数中调用依赖项。 Spring 在构造对象后连接 bean 依赖项,所以在这里您尝试过早地调用这些方法,Spring 那时没有机会连接您的 bean。要解决此问题,您可以使用 @PostConstruct
注释。 Spring 在构造和连接一个 bean 之后总是调用标有此标记的方法。
例如
public ApplicationStrings() {
}
@PostConstruct
public void init() {
//translationService.initLocale();
this.updateLocale();
}