Kishore Bulusu
Kishore Bulusu

Reputation: 283

Spring CrudRepository is null for @Autowired member variable

I am new to Spring JPA. I am trying to use hibernate + Spring JPA. For this I created below repository

package com.raptorservice.da.dal;

import com.raptorservice.da.objects.ClientDO;
import org.springframework.data.repository.CrudRepository;

public interface ClientRepository extends CrudRepository<ClientDO, String> {    
}

Below is my spring-ws-servlet.xml where i browse through my packages.

<?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:sws="http://www.springframework.org/schema/web-services"
    xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xmlns:jpa="http://www.springframework.org/schema/data/jpa"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
                        http://www.springframework.org/schema/beans/spring-beans.xsd 
                        http://www.springframework.org/schema/web-services 
                        http://www.springframework.org/schema/web-services/web-services.xsd 
                        http://www.springframework.org/schema/oxm 
                        http://www.springframework.org/schema/oxm/spring-oxm.xsd
                        http://www.springframework.org/schema/jdbc
                        http://www.springframework.org/schema/jdbc/spring-jdbc.xsd
                        http://www.springframework.org/schema/data/jpa
                        http://www.springframework.org/schema/data/jpa/spring-jpa.xsd
                        ">

    <!--  ****************************** BASIC CONFIGURATION ******************************************** -->
    <!-- Enable annotations for end points -->
    <sws:annotation-driven />


    <bean id="getpointsbean" class="com.raptorservice.endpoints.GetPointsEndpoint">
    </bean>

    <sws:dynamic-wsdl id="points" portTypeName="Points" locationUri="/points/" targetNamespace="http://sailin.com/schemas">
        <sws:xsd location="/WEB-INF/xsd/points.xsd" />
    </sws:dynamic-wsdl>

    <!--  Configure JAXB to marshal and un-marshal requests -->
    <oxm:jaxb2-marshaller id="jaxbMarshaller"  contextPath="com.raptorservice.generated" />



    <!-- ******************************* PERSISTANCE CONFIGURATION ****************************************** -->
    <!--  JPA Repositories -->
<jpa:repositories  base-package="com.raptorservice.da.dal" /> 



    <!--  Hibernate Transaction Manager -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/testservice" />
        <property name="username" value="root" />
        <property name="password" value="admin" />
    </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="persistenceXmlLocation" value="./WEB-INF/persistence.xml"></property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="database" value="MYSQL" />
                <property name="showSql" value="true" />
            </bean>
        </property>
     </bean>


    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
<!--        <property name="configLocation"> -->
<!--            <value>classpath:hibernate.cfg.xml</value> -->
<!--        </property> -->
<!--        <property name="configurationClass"> -->
<!--            <value>org.hibernate.cfg.AnnotationConfiguration</value> -->
<!--        </property> -->
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>



 </beans>

I do have a valid persistence.xml file too under WEB-INF.

I am trying to use the ClientRepository in my webservice (@Endpoint) as below

package com.raptorservice.endpoints;


@Endpoint
public class GetPointsEndpoint {    

    @Autowired
    private ClientRepository clientRepository;

@PayloadRoot(localPart="getPointsForClientAndCustomerRequest", namespace="http://sailin.com/schemas")
    @ResponsePayload()
    public GetPointsForClientAndCustomerResponse getPointsForClientAndCustomerRequest(@RequestPayload GetPointsForClientAndCustomerRequest getpointsRequest) throws Exception
    {
        GetPointsForClientAndCustomerResponse resp = new GetPointsForClientAndCustomerResponse();
        ResultCode resCode = new ResultCode();

        try
        {
        ClientDO client = new ClientDO();
        client.setName("Test1");
        client.setClientId("test111");
        clientRepository.save(client);
        }
        catch(Exception ex)
        {
          System.out.println(ex);
        }


        resCode.setDescription("pass");
        resCode.setCode(BigInteger.valueOf(5));
        resp.setResultCode(resCode);
        return resp;
    }

But the clientRepository is always null. What am I missing? Why is clientRepository not being auto wired?

I checked the logs and nothing obvious. Please help.

Thanks in advance.

Upvotes: 2

Views: 4430

Answers (1)

Boris Treukhov
Boris Treukhov

Reputation: 17774

I think that <context:annotation-config/> is missing, this annotation is required to register a AutowiredAnnotationBeanPostProcessor instance in the application context.

AutowiredAnnotationBeanPostProcessor is also implicitly registered in the app context if you have used <context:component-scan ...> annotation in its xml configuration.

See Difference between <context:annotation-config> vs <context:component-scan>

Typically if the field value is null and no exception occurs it means that either the object is not a Spring bean(instantiated somewhere else), or that it's not post processed by the IoC container(maybe the post processor was registered in another context ).

As the beans are eagerly initialized singletons and @Autowired annotation has required attribute set to true by default, Spring will most likely throw an exception during the container initialization if the bean is processed at all.

Upvotes: 2

Related Questions