Spring i @Autowired daje NullPointerException

0

siemacie
Natkneło mnie jakoś żeby popróbować konfiguracji springa przez klase, nie xml'a, wiec zrobilem projekt, jakas tam podstawową konfiguracje i próbuje wstrzykiwać klasy przez @Autowired i coś mi nie bangla bo wyrzuca NullPointerException. Przekopałem troche internety i gdzieś musze robić głupi błąd, może wy wiecie o co chodzi?

Klasa konfiguracyjna: (ten bean person to tak dla sprawdzenia wczesniej robiłem)

import com.maciej.entities.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan
public class ConfigClass {
    @Bean
    public Person person(){
        return new Person();
    }
}

PersonService:

import org.springframework.stereotype.Service;

@Service
public class PersonService {
    public void create(){
        System.out.println("Person created.");
    }
    public void delete(){
        System.out.println("Person deleted.");
    }
}

Klasa testowa:

import com.maciej.ConfigClass;
import com.maciej.entities.Person;
import com.maciej.services.PersonService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.stereotype.Component;

@Component
public class Test {

    @Autowired
    private PersonService personService;

    public PersonService getPersonService() {
        return personService;
    }

    public void setPersonService(PersonService personService) {
        this.personService = personService;
    }

    public static void main(String[] args){
        AnnotationConfigApplicationContext acac = new AnnotationConfigApplicationContext(ConfigClass.class);
        Person person = acac.getBean("person", Person.class);
            person.setId(1L);
            person.setName("Wojciech");
        System.out.println(person.toString());

        new Test().getPersonService().create();                          <<<<<------------ ta linijka wyrzuca NullPointera
    }
}

i może jeszcze POM gdyby to miało znaczenie:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.maciej</groupId>
  <artifactId>com.maciej</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>com.maciej</name>
  <a href="http://maven.apache.org">http://maven.apache.org</a>

  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <spring.version>4.0.5.RELEASE</spring.version>
  </properties>

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
</dependencies>
</project>

Przy okazji:
Czy teraz jest możliwość 100%towej konfiguracji springa za pomocą klas? Są adnotacje ekwiwalentne do np. context:annotation-config/ albo mvc:annotation-driven/?
Tak samo web.xml -> gdzieś słyszałem, że jego też można już za pomocą klas konfigurować :P

A ogólnie często się spotykacie z takimi klasami, czy raczej pozostaje się wciąż w standardowych xmlach?

0

OMG chłopie umieram jak widze te twoje tematy. Spróbuj kiedyś zrozumieć jak działaja narzędzia których próbujesz używać. Żeby coś wstrzykiwać to musisz mieć obiekt zarządzany przez kontener IoC. To znaczy że wstrzykiwanie i wszystkie inne cuda działają tylko dla obiektów tworzonych przez kontener. Jak sobie coś stworzysz przez new to nie będzie zarządzane przez kontener.
Więc to twoje Autowire w klasie Test jest o kant d**y skoro potem robisz new Test(). Weź łaskawie może wyciągnij obiekt Test z kontenera IoC (tak jak wyciągasz obiekt Person)...

0

omg faktycznie, przecież Test nie brałem z kontenera.. niedalej jak 10 minut temu czytałem o tym na SO i jakoś nie zaskoczyłem :P http://stackoverflow.com/questions/19896870/why-is-my-spring-autowired-field-null
dzieki za wsparcie, jak ktoś może odpowiedzieć na pytania nizej tematu to byloby fajnie

0

Srping boot i danotacje

0

Ja nie widziałem specjalnie projektów konfigurowanych w ten sposób i generalnie nie jestem zwolennikiem. Bo w efekcie nie możesz na przykład zmodyfikować konfiguracji bez rekompilacji.

0

To wszystko zależy co chcesz zrobić bo uruchamiają aplikację w spring boot domyślnie szuka pliku application.properties w aktualnym katalogu. Oczywiście również możesz mu przekazać parametry w standardowy sposób -D. I teraz bez rekompilacji możesz zmieniać parametry konfiguracji. Oczywiście nie zrobisz tutaj takiej rewolucji w stylu całkowita wymiana prowidera JMS itp tak jak to można w XML

1

Tak, można pokonfigurować wszystko bez xmla

web.xml

public class MoviesDBInitializer implements WebApplicationInitializer {

    private static final String DISPATCHER_SERVLET_NAME = "dispatcher";
    private static final String DISPATCHER_SERVLET_MAPPING = "/*";

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext rootContext = new AnnotationConfigWebApplicationContext();
        rootContext.register(MvcConfig.class);

        ServletRegistration.Dynamic dispatcher = servletContext.addServlet(DISPATCHER_SERVLET_NAME, new DispatcherServlet(rootContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping(DISPATCHER_SERVLET_MAPPING);
        servletContext.addListener(new ContextLoaderListener(rootContext));
    }
}
 
@Configuration
@ComponentScan(basePackages = {"pl.movies"})
@EnableWebMvc
@EnableSpringDataWebSupport
@EnableJpaRepositories(basePackages = {"pl.movies.repository"})
@EnableTransactionManagement
@PropertySource("classpath:application.properties")
public class MvcConfig extends WebMvcConfigurerAdapter {

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver";
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url";
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username";
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password";
    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect";
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql";
    private static final String PROPERTY_NAME_HIBERNATE_FORMAT_SQL = "hibernate.format_sql";
    private static final String PROPERTY_NAME_HIBERNATE_CREATE_TABLES = "hibernate.hbm2ddl.auto";
    private static final String VIEW_RESOLVER_PREFIX = "/WEB-INF/pages/";
    private static final String VIEW_RESOLVER_SUFFIX = ".jsp";

    @Resource
    private Environment env;

    private Properties hibProperties() {
        Properties properties = new Properties();
        properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT));
        properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL));
        properties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
        properties.put(PROPERTY_NAME_HIBERNATE_FORMAT_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_FORMAT_SQL));
        return properties;
    }

    @Bean
    public InternalResourceViewResolver configureInternalResourceViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix(VIEW_RESOLVER_PREFIX);
        resolver.setSuffix(VIEW_RESOLVER_SUFFIX);
        return resolver;
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/**").addResourceLocations("/");
    }

    @Bean
    public DataSource dataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER));
        dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL));
        dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME));
        dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD));

        return dataSource;
    }

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource());
        entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistence.class);
        entityManagerFactoryBean.setJpaProperties(hibProperties());
        entityManagerFactoryBean.setPackagesToScan("pl.movies.model");

        return entityManagerFactoryBean;
    }

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
        return transactionManager;
    }
}

 

1 użytkowników online, w tym zalogowanych: 0, gości: 1