使用@Autowired时将原始属性注入Spring bean? [英] Inject primitive properties to Spring bean when using @Autowired?

查看:85
本文介绍了使用@Autowired时将原始属性注入Spring bean?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

尝试通过Spring注入以下内容的myInt

try to inject myInt of the following through Spring

public class MyBean {
@Resource (name="myValue")
private int myInt;

有什么主意吗?我收到了以下帖子.但这对我不起作用.我仍然收到以下错误消息.

Any idea? I have got the following post. But it don't work for me. I still get the following error message.

Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'myValue' must be of type [int], but was actually of type [java.lang.Integer]

详细信息:

以下是我为此测试创建的测试servlet.

Detail:

The following is the test servlet that I have create for this testing.

@WebServlet("/myTestServlet")
public class myTestServlet extends HttpServlet {

private static final long serialVersionUID = 1L;

public myTestServlet() {
    super();
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doProcess(request);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    doProcess(request);
}

private void doProcess(HttpServletRequest request)
{
    WebApplicationContext applicationContext =
    WebApplicationContextUtils.getWebApplicationContext(
        ((HttpServletRequest) request).getSession().getServletContext());
    MyService service = applicationContext.getBean(MyService.class);
    service.doPrint();

}
}

以下是我用于此测试的服务bean.

The following is service bean that I am using for this test.

public class MyService {
//  @Autowired
//  @Qualifier("myValue")


@Resource (name="myValue")
private int myInt;

public void doPrint ()
{
    System.out.println("myInt is " + myInt);
}
}

以下是我正在使用的applicationContext.xml

<context:annotation-config />

<bean id="myService" class="tsttst.MyService" >
</bean>

<!-- Global configuration -->
<bean id="myValue" class="java.lang.Integer" factory-method="valueOf">
    <constructor-arg value="1000" />
</bean>

以下是使用@Resource

Caused by: org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named 'myValue' must be of type [int], but was actually of type [java.lang.Integer]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:349)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:435)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:409)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor$ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:541)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:147)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
    at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:297)
    ... 21 more

但是,如果我使用@Autowired,将导致以下错误

However, if I use @Autowired, the following error will be resulted

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private int tsttst.MyService.myInt; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [int] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=myValue)}
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:507)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:283)
    ... 21 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [int] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=myValue)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:914)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:783)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:697)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:478)
    ... 23 more

推荐答案

int是如何定义的?

How is the int defined?

如果它是属性(例如带有占位符配置器),则可以使用@Value.

If it is property (with a placeholder configurer for example) you can use @Value.

如果使用构造函数arg或工厂方法用<bean id="myValue" class="java.lang.Integer">..</bean>定义了它,那么@Autowired/@Resource应该可以工作.

If it is defined with <bean id="myValue" class="java.lang.Integer">..</bean> with either constructor-arg or a factory-method, then @Autowired / @Resource should work.

至于自动拆箱-似乎不起作用,因此您需要Integer.
您也可以尝试<util:constant .. />

As for autounboxing - it seems it does not work, so you'd need an Integer.
You can also try <util:constant .. />

这篇关于使用@Autowired时将原始属性注入Spring bean?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆