2013-11-13 3 views
0

Я использую Spring> аннотаций инъекции на основеинъекция на основе аннотации; инициализировать пустую карту

@Component 
public class MyClass { 
    private ConcurrentHashMap<String, String> myMap; 

    public MyClass() { 
     myMap = new ConcurrentHashMap<String, String>(); 
    } 

    public void foo() { 
     myMap.put("a", "b"); 
    } 
} 

XML

<?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:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-3.0.xsd 
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 

      <context:component-scan base-package="com.basePackage" /> 
      <context:annotation-config/> 

    </beans> 

Main() класс

public class MyMain() { 
    public static void main(String[] args) 
    // [EDITED. ADDED NOW - BEGIN] 
    ApplicationContext context = new GenericXmlApplicationContext(
     "myApplicationContext.xml"); 
    // [EDITED. ADDED NOW - END] 

     MyClass myObj = (MyClass) context.getBean(MyClass.class); 
     myObj.foo(); 
    } 
} 

myObj.foo() поднимает NPE. Я ожидал этого: когда я получаю bean-компонент, вызывается конструктор карты и создается экземпляр карты, и код работает плавно.

Ничего не получилось:
private ConcurrentHashMap myMap = new ConcurrentHashMap();

Как получить этот код. ПРИМЕЧАНИЕ:

  • Я не хочу добавлять конфигурацию детали в xml и часть в java. Это тоже я пытаюсь создать экземпляр с пустой картой.
  • Я хочу, чтобы эта работа была обработана самим аннотацией, и получить карту, созданную пустым, прежде чем я ее впервые использую.
+1

Пожалуйста, разместите XML и инициализацию 'ApplicationContext'. –

+0

Связанный вопрос: [link] (http://stackoverflow.com/questions/9663660/initialize-empty-arraylists-in-spring-configuration). Подходы к этому не работали действительно для меня, хотя в моем случае – smc

+0

Я не могу воспроизвести вашу проблему. Должно быть, вы не показываете нас. –

ответ

1

Возможно, вы не представите нам все детали. Исключением не является hapenning, потому что ваш ConcurrentHashMap - null. Это происходит потому, что вы передаете объект null на ваш вызов put(). Класс ConcurrentHashMap не поддерживает null ключей. В Javadoc состояния

Как Hashtable, но в отличие от HashMap, этот класс не позволяет нулевой до использоваться в качестве ключа или значения.

+0

Да U r справа. Я понял это, когда снова пытался запустить программу. Спасибо, моя проблема решена. – smc

+0

@smc Рад, что я мог бы помочь. Рассмотрите возможность поиска и принятия любых полезных ответов. –

0

Здесь не может быть NPE, если ваш контекст не равен нулю. Если в моем контексте нет класса MyClass.class, будет выбрано исключение NoSuchBeanDefinitionException. Если вам удалось получить компонент bean-компонента, он инициализируется, а myMap - это пустая карта. Ищите там проблему somehwere else

+0

Мои пробные пробеги дают мне NPE. Вот снимок: Исключение в потоке "основного" java.lang.NullPointerException \t на java.util.concurrent.ConcurrentHashMap.hash (ConcurrentHashMap.java:333) \t в java.util.concurrent.ConcurrentHashMap.put (ConcurrentHashMap. java: 1125) \t at com.basePackage.MyClass.foo (MyClass.java:21) \t at com.basePackage.MyMain.main (MyMain.java: 28) – smc

0

сначала: вам нужен сеттер & getter в MyClass для поля myMap. второй: вы не используете новую операцию в MyClass для MyMap потому

MyClass myObj = (MyClass) context.getBean(MyClass.class); 

делает инъекцию и, конечно, выделить память для него.

+0

Вам не нужен геттер и сеттер, если вы не устанавливаете '' ''. –

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