Search code examples
javaspringspring-mvcspring-dataspring-annotations

Using <context:component-scan base-package /> in annotation based configuration


I have gone through different resources but still I am not getting my work done. Here is my Spring annotation based configuration :-

@Configuration
@EnableTransactionManagement
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan({ "org.baeldung.persistence" })
public class PersistenceJPAConfig {

@Autowired
private Environment env;

public PersistenceJPAConfig() {
    super();
}

// beans

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource());
    em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" });

    final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    em.setJpaVendorAdapter(vendorAdapter);
    em.setJpaProperties(additionalProperties());

    return em;
}

@Bean
public DataSource dataSource() {
    final DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("jdbc.driverClassName")));
    dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("jdbc.url")));
    dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("jdbc.user")));
    dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("jdbc.pass")));

    return dataSource;
}

@Bean
public PlatformTransactionManager transactionManager(final EntityManagerFactory emf) {
    final JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(emf);
    return transactionManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

final Properties additionalProperties() {
    final Properties hibernateProperties = new Properties();
    hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
    hibernateProperties.setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
    // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers",
    // "true");
    return hibernateProperties;
}

}

I have my controller class in org.baeldung.persistence.controller package and denoted @Controller at the top of the class. Still I am getting 404 error when I access the URL /products. Here is my controller class

@Controller
public class ProductViewController {
@RequestMapping(value = "/products", method = RequestMethod.POST)
public String create(@ModelAttribute("product") final Product product)     {
    final ProductServiceImpl productServiceImpl = new ProductServiceImpl();
    if (productServiceImpl.create(product)) {
        return "Product with product name : " + product.getProduct_name() + "Has been created";
    } else {
        return "Error while creating the product record";
    }

}

Solution

  • Sinnce your controller class is in org.baeldung.persistence.controller package, you have to scan components in this package

    @ComponentScan({ "org.baeldung.persistence.controller" })
    

    you will also need to add @EnableWebMvc in PersistenceJPAConfig class

    @EnableWebMvc