0

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]

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();

}
}

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);
}
}

The following is the applicationContext.xml that I am using

<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>

The following is the error that I have got when use @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

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
Community
  • 1
  • 1
raymond.mh.ng
  • 343
  • 2
  • 3
  • 21

1 Answers1

5

How is the int defined?

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

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.

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

Bozho
  • 588,226
  • 146
  • 1,060
  • 1,140
  • As the value is not changed frequently and don't want to add more property file, I don't use placeholder at this moment. I use the second method in your answer, however got the attached error. I seems that my spring container consider int type is not compatible with the Java Integer type. Is there any setting may cause this error? Thanks. PS. The seam error appear when I use @Autowired instead of @Resource. (My spring version is 3.0.3, will this make any different?) – raymond.mh.ng Jun 10 '11 at 02:10