Spring:自动装配 java.util.Locale 类型的 bean 似乎不起作用

发布于 2024-12-05 18:41:04 字数 1345 浏览 2 评论 0原文

我正在为我的开发人员同事编写一个关于 Spring (3.0.x) 的非常简单的教程,并且遇到了一个奇怪的行为:java.util.Locale 类型的 bean 没有自动装配到其他 bean 中,并且没有错误消息。但仍然可以正常创建另一个 bean,只是该字段为空。

详细信息:

  • 配置完全基于 XML。
  • Bean定义如下:

    
        <构造函数值=“es”/>
        <构造函数值=“ES”/>
    
    
    ;
    
  • 未使用自动装配定制。

  • 类:

包com.bsl.training.theclock;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;


public class SimpleDateTimeBean3 {
    private Locale locale;

    public SimpleDateTimeBean3() {

    }

    public void setLocale(final Locale loc) {
        locale = loc;
    }

    public Locale getLocale() {
        return locale;
    }

    public String getDateTime() {
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);
        return df.format(new Date());
    }   
}
  • 如果我向 SimpleDateTimeBean3 类添加一个字段(该类型是我自己的类之一并且存在这样的 bean),那么一切都会完美运行。
  • 不会打印任何错误,两个 bean(spanishLocale、dateTimeBeanSetter)均已创建并可从 ApplicationContext 访问,但在“dateTimeBeanSetter”bean 上调用 getDateTime() 会给出 NPE。

有什么想法吗?

提前致谢。

I am writing a very simple tutorial about Spring (3.0.x) for my fellow developers and have encountered a weird behaviour: bean of type java.util.Locale is not autowired into other bean and there is no error message. But still, the other bean gets created ok, just the field is null.

To the details:

  • Configuration is purely XML based.
  • Bean definitions are as follows:

    <bean id="spanishLocale" class="java.util.Locale">
        <constructor-arg value="es"/>
        <constructor-arg value="ES"/>
    </bean>
    
    <bean id="dateTimeBeanSetter" class="com.bsl.training.theclock.SimpleDateTimeBean3" autowire="byType"/>
    
  • No autowire customisation has been used.

  • Class:

package com.bsl.training.theclock;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;


public class SimpleDateTimeBean3 {
    private Locale locale;

    public SimpleDateTimeBean3() {

    }

    public void setLocale(final Locale loc) {
        locale = loc;
    }

    public Locale getLocale() {
        return locale;
    }

    public String getDateTime() {
        DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL, locale);
        return df.format(new Date());
    }   
}
  • If I add a field to the SimpleDateTimeBean3 class, which type is one of my own classes and such bean exists, everything works perfectly.
  • No errors are printed, both beans (spanishLocale, dateTimeBeanSetter) are created and accessible from ApplicationContext, but calling getDateTime() on the 'dateTimeBeanSetter' bean gives a NPE.

Any ideas?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情何以堪。 2024-12-12 18:41:04

两个关键文档片段:

来自参考手册第 3.4.5.1 节:

您无法自动装配所谓的简单属性,例如基元、字符串和类(以及此类简单属性的数组)。此限制是设计使然的

使然,来自 org.springframework.beans.BeanUtils#isSimpleProperty() javadoc:

检查给定类型是否表示“简单”属性:原语、字符串或其他 CharSequence、数字、日期、URI、URL、区域设置、类或相应的数组。检查是否给定类型表示“简单”属性:基元、字符串或其他 CharSequence、数字、日期、URI、URL、区域设置、类、或相应的数组。

所以,按设计工作。

Two key documentation fragments:

From reference manual section 3.4.5.1:

You cannot autowire so-called simple properties such as primitives, Strings, and Classes (and arrays of such simple properties). This limitation is by-design

And from org.springframework.beans.BeanUtils#isSimpleProperty() javadoc:

Check if the given type represents a "simple" property: a primitive, a String or other CharSequence, a Number, a Date, a URI, a URL, a Locale, a Class, or a corresponding array.Check if the given type represents a "simple" property: a primitive, a String or other CharSequence, a Number, a Date, a URI, a URL, a Locale, a Class, or a corresponding array.

So, Working As Designed.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文