Reputation: 283
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
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