2012-07-03 2 views
3

У меня есть фасоль mongoService, который выглядит вроде какSpring: NullPointerException происходит при включении боба

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> 

    <context:property-placeholder location="file:///storage//local.properties"/> 
    <bean id="mongoService" class="com.business.persist.MongoService"> 
    <constructor-arg value="${host}"/> 
    <constructor-arg value="${port}"/> 
    <constructor-arg value="${database}"/> 
    </bean> 
</beans> 
  • Мне нужно включить этот компонент в отдельном проекте, так что я создал банку для этого проекта, и добавил, в Maven зависимость, которая выглядит как

    <dependency> 
         <groupId>com.project</groupId> 
         <artifactId>business</artifactId> 
         <version>master-SNAPSHOT</version> 
        </dependency> 
    
  • Теперь в файле, где мне нужно, чтобы ввести это поле, я следующий

public class DocumentSaver implements IDocumentSaver { 
    @Resource 
    private MongoService mongoService; 

    public boolean addDocument(Document doc) { 
     // do other things 

     // add document to mongo 
     mongoService.putDocument(document); 

     return true; 
    } 
} 

, а затем я запускаю тест следующим

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/com/wireup.xml") 
public class DocumentSaverTest extends DocumentCase { 

    @Test 
    public void loadAndSave() { 
      DocumentSaver saver = new DocumentSaver(); 
      Document doc = new Document(); 
      // fill the doc 
      saver.addDocument(doc); 
     } 
} 

Я вижу NullPointerException когда я бегу это на как saver.addDocument(doc);

Пожалуйста, скажите мне, что я я делаю неправильно

Спасибо

ответ

2

Нельзя создавать «DocumentSaver» с оператором NEW следующим образом, получить это из контекста Spring Application.

DocumentSaver saver = новый DocumentSaver();

Если вы используете операцию NEW, Spring не будет вводить зависимые объекты.

1

Моя догадка заключается в том, что ваш DocumentSaver не управляется весной, поэтому MongoService не автоуведомлен. Вы можете либо определить DocumentSaver в качестве весеннего компонента в весеннем файле xml + связать ссылку MongoService с ним, либо аннотировать его (например, как @Repository или @Component), а затем использовать компонентное сканирование в XML-файле.

Во-вторых, кажется, что вы создаете объект DocumentSaver через нового оператора. Боб должен был быть извлечен из весеннего контекста, чтобы автомонтировать MongoService. Или другой вариант, если вы не хотите, чтобы DocumentSaver был весенним бобом, должен использовать @Configurable в вашем DocumentSaver, который использует аспектное сотканье.

1
  1. Аннотировать свой Saver @Component. Альтернатива здесь объявит это как еще один обычный Bean в вашем XML-файле.
  2. @AutowiredMongoService;
  3. @AutowiredDocumentSaver до saver на вашем тестовом классе.

Отредактированные классы следует.

Ваш компонент будет выглядеть так:

@Component 
public class DocumentSaver implements IDocumentSaver { 

    @Autowired 
    private MongoService mongoService; 

    public boolean addDocument(Document doc) { 
     // do other things 

     // add document to mongo 
     mongoService.putDocument(document); 

     return true; 
    } 
} 

и ваше испытание должно быть так:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("/com/wireup.xml") 
public class DocumentSaverTest extends DocumentCase { 

    @Autowired 
    DocumentSaver saver; 

    @Test 
    public void loadAndSave() { 
     Document doc = new Document(); 
     // fill the doc 
     saver.addDocument(doc); 
    } 
} 
1

Если вы создании экземпляра вашего DocumentSaver с новым, вы не ставите его в Спринг контекст. Так что Spring не знает этого, и инъекция не выполняется.

Вы должны позволить ему создать стимул к весне, если вы хотите иметь в нем MongoService.

Добавить в вашем wireup.xml файла:

<bean id="documentSaver" class="com....DocumentSaver" /> 

Затем вводят этот documentSaver в тесте:

@Autowired 
private DocumentSaver documentSaver; 

Ваше именовании плохо.

Ваш класс DocumentSaver представляется DAO (потому что целью является сохранение документа). Таким образом, аннотируйте его с @Repository и назовите его DocumentSaverDAO.

Объедините мой ответ и Спайта, и он будет работать и быть хорошо упакован.

1

DocumentSaver должен управляться весной (в настоящее время это не так, поскольку вы создаете его на new) или сплетены, так что вводятся зависимости, такие как MongoService. См. this ответ для получения дополнительной информации об инъекции зависимостей в объекты, созданные с помощью new.

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