2016-11-02 5 views
2

У меня есть ресурс, который впрыскивает следующий класс@Autowired работает, но не @Inject

@Component 
public class CustomDozerBeanMapper implements Mapper { 
    private final DozerBeanMapper beanMapper; 

    public CustomDozerBeanMapper() { 
     this.beanMapper = new DozerBeanMapper(); 
     BeanMappingBuilder builder = new BeanMappingBuilder() { 
      protected void configure() { 
       //some mapping stuff 
      } 
     }; 
     beanMapper.addMapping(builder); 
    } 

    @Override 
    public <T> T map(Object o, Class<T> aClass) throws MappingException { 
     return beanMapper.map(o, aClass); 
    } 

    @Override 
    public void map(Object o, Object o1) throws MappingException { 
     beanMapper.map(o, o1); 
    } 

    @Override 
    public <T> T map(Object o, Class<T> aClass, String s) throws MappingException { 
     return beanMapper.map(o, aClass, s); 
    } 

    @Override 
    public void map(Object o, Object o1, String s) throws MappingException { 
     beanMapper.map(o, o1, s); 
    } 
} 

В моей applicationContext.xml я объявил

<context:annotation-config/> 
<context:component-scan base-package="foo.bar"/> 
<bean id="customDozerMapper" class="foo.bar.CustomDozerBeanMapper" /> 

Тогда на нашем ресурсе я впрыснуть его

class SomeResource { 
    @Inject CustomDozerMapper customDozerMapper; 

    //We have loads of other Injects which work just fine, only this class has problems 
} 

Caused by: A MultiException has 1 exceptions. They are: 
1. org.glassfish.hk2.api.UnsatisfiedDependencyException: There was no object available for injection at SystemInjecteeImpl(requiredType=CustomDozerBeanMapper,parent=SomeResource,qualifiers={},position=-1,optional=false,self=false,unqualified=null,1098507248) 

    at org.jvnet.hk2.internal.ThreeThirtyResolver.resolve(ThreeThirtyResolver.java:75) 
    at org.jvnet.hk2.internal.Utilities.justInject(Utilities.java:947) 
    at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:975) 
    at org.jvnet.hk2.internal.ServiceLocatorImpl.inject(ServiceLocatorImpl.java:965) 
    at org.glassfish.jersey.server.spring.SpringComponentProvider$SpringManagedBeanFactory.provide(SpringComponentProvider.java:191) 
    at org.jvnet.hk2.internal.FactoryCreator.create(FactoryCreator.java:153) 
    at org.jvnet.hk2.internal.SystemDescriptor.create(SystemDescriptor.java:471) 
    at org.jvnet.hk2.internal.PerLookupContext.findOrCreate(PerLookupContext.java:70) 
    at org.jvnet.hk2.internal.Utilities.createService(Utilities.java:2072) 
    at org.jvnet.hk2.internal.ServiceLocatorImpl.internalGetService(ServiceLocatorImpl.java:761) 
    at org.jvnet.hk2.internal.ServiceLocatorImpl.getService(ServiceLocatorImpl.java:700) 
    at org.glassfish.jersey.internal.inject.Injections.getOrCreate(Injections.java:172) 
    at org.glassfish.jersey.server.model.MethodHandler$ClassBasedMethodHandler.getInstance(MethodHandler.java:284) 
    at org.glassfish.jersey.server.internal.routing.PushMethodHandlerRouter.apply(PushMethodHandlerRouter.java:74) 
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:109) 
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) 
    at org.glassfish.jersey.server.internal.routing.RoutingStage._apply(RoutingStage.java:112) 

Теперь, если я меняю и использовать @Autowired, он отлично работает Мы используем Spring для управления зависимостями, но по какой-то причине H2k используется, и я получаю следующее исключение

Может кто-нибудь, пожалуйста, объясните, в чем проблема возможно?

Почему это работает с @Autowired и не @Inject

Почему H2k используется, а не весной?

+0

почему Вы определили один бит 2 раза (в конфигурации XML и с помощью '@ Component')? – Andrew

+0

Нет особых причин. Я могу попытаться удалить аннотацию и посмотреть, помогает ли она –

+1

Вау, это на самом деле решило ее. Огромный момент WTF для меня. Если это была огромная проблема, она должна была бы улучшить сообщение об ошибке –

ответ

1

Возможно, проблема может быть из-за 2-х деклараций боба (один в конфигурации XML и другой с @Component) и контейнер DI может не в состоянии выбрать одну из них.

Все решения, которые доступны здесь:

  1. удаление один из бинов (я бы предпочел XML один)
  2. указания боб по @Qualifier или @Named аннотацию
0

Проблема может быть связана с именем компонента в файле конфигурации customDozerMapper и фактической инъекцией customerDozerMapper не соответствуют. Если @inject не находит соответствующий бит, он выдает исключение. Однако есть положение для @autowired, в котором вы можете установить атрибут required=false, и он вводит null, если он не находит соответствующий компонент.

Примечание: Конфигурация в конфигурации xml переопределяет аннотацию .

+0

Простите, это не проблема. Вы правы и неправы. Это была опечатка, когда я написал 'customerDozerMapper' здесь в stackoverflow. Я починил это. Проблема заключалась в том, что я определил @Component и тот же компонент в applicationContext.xml –

+0

Хорошо определить @Component и тот же компонент в файле конфигурации не должно быть проблемой. Файл Config просто переопределяет вашу конфигурацию аннотации. Просто интересно, как это решило вашу проблему. :-) – Khuzi

+1

@ Khuzi, XML не переопределяет конфигурацию аннотаций в этом случае, будет создано только 2 боба с разными именами – Andrew

Смежные вопросы