'Consider defining a bean of type 'com.example.conexion.repository.ClienteRepository' in your configuration
Good afternoon I'm trying to run a SOAP service with Spring Boot and I get the following error:
*************************** APPLICATION FAILED TO START
Description:
Parameter 0 of constructor in com.example.conexion.service.ClienteServiceImpl required a bean of type 'com.example.conexion.repository.ClienteRepository' that could not be found.
Action:
Consider defining a bean of type 'com.example.conexion.repository.ClienteRepository' in your configuration.
I know that maybe it should be a silly mistake, but I don't see it
Annex my code:
SpringBootSoapApp.java
package com.example.conexion;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class })
public class SpringBootSoapApp {
public static void main(String[] args) {
SpringApplication.run(SpringBootSoapApp.class, args);
}
}
WebServiceConfig.java
package com.example.conexion.config;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
import org.springframework.ws.config.annotation.EnableWs;
import org.springframework.ws.config.annotation.WsConfigurerAdapter;
import org.springframework.ws.transport.http.MessageDispatcherServlet;
import org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition;
import org.springframework.xml.xsd.SimpleXsdSchema;
import org.springframework.xml.xsd.XsdSchema;
import com.example.conexion.endpoint.ClienteEndpoint;
@EnableWs
@Configuration
public class WebServiceConfig extends WsConfigurerAdapter {
@SuppressWarnings({ "rawtypes", "unchecked" })
@Bean
public ServletRegistrationBean messageDispatcherServlet(ApplicationContext appContext){
MessageDispatcherServlet servlet = new MessageDispatcherServlet();
servlet.setApplicationContext(appContext);
servlet.setTransformWsdlLocations(true);
return new ServletRegistrationBean(servlet, "/ws/*");
}
// localhost:8080/ws/movies.wsdl
@Bean(name = "clientes")
public DefaultWsdl11Definition defaultWsdl11Definition(XsdSchema schema){
DefaultWsdl11Definition wsdl11Definition = new DefaultWsdl11Definition();
wsdl11Definition.setPortTypeName("ClientesPort");
wsdl11Definition.setLocationUri("/ws");
wsdl11Definition.setTargetNamespace(ClienteEndpoint.NAMESPACE_URI);
wsdl11Definition.setSchema(schema);
return wsdl11Definition;
}
@Bean
public XsdSchema moviesSchema(){
return new SimpleXsdSchema(new ClassPathResource("cliente.xsd"));
}
}
ClienteEndpoint.java
package com.example.conexion.endpoint;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
import com.example.conexion.entity.Cliente;
import com.example.conexion.service.ClienteService;
import com.example.conexion.gs_ws.ClienteType;
import com.example.conexion.gs_ws.GetAllClientesRequest;
import com.example.conexion.gs_ws.GetAllClientesResponse;
import com.example.conexion.gs_ws.GetClienteByIdRequest;
import com.example.conexion.gs_ws.GetClienteByIdResponse;
@Endpoint
public class ClienteEndpoint {
public static final String NAMESPACE_URI = "http://www.javaspringclub.com/movies-ws";
private ClienteService service;
public ClienteEndpoint() {
}
@Autowired
public ClienteEndpoint(ClienteService service) {
this.service = service;
}
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getClienteByIdRequest")
@ResponsePayload
public GetClienteByIdResponse getMovieById(@RequestPayload GetClienteByIdRequest request) {
GetClienteByIdResponse response = new GetClienteByIdResponse();
Cliente clienteEntity = service.getClienteById(request.getClienteCedula());
ClienteType clienteType = new ClienteType();
BeanUtils.copyProperties(clienteEntity, clienteType);
response.setClienteType(clienteType);
return response;
}
@PayloadRoot(namespace = NAMESPACE_URI, localPart = "getAllClientesRequest")
@ResponsePayload
public GetAllClientesResponse getAllMovies(@RequestPayload GetAllClientesRequest request) {
GetAllClientesResponse response = new GetAllClientesResponse();
List<ClienteType> clienteTypeList = new ArrayList<ClienteType>();
List<Cliente> clienteEntityList = service.getAllClientes();
for (Cliente cliente : clienteEntityList) {
ClienteType clienteType = new ClienteType();
BeanUtils.copyProperties(cliente, clienteType);
clienteTypeList.add(clienteType);
}
response.getClienteType().addAll(clienteTypeList);
return response;
}
}
Cliente.java
package com.example.conexion.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Cliente {
@Id
@Column(name="CEDULA")
private int cedula;
@Column(name="NOMBRE")
private String nombre;
@Column(name="APELLIDO")
private String apellido;
@Column(name="TIPO_CLIENTE")
private String tipo_cliente;
// Getter y Setters
public int getCedula() {
return cedula;
}
public void setCedula(int cedula) {
this.cedula = cedula;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
public String getTipo_cliente() {
return tipo_cliente;
}
public void setTipo_cliente(String tipo_cliente) {
this.tipo_cliente = tipo_cliente;
}
}
ClienteRespository.java
package com.example.conexion.repository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.example.conexion.entity.Cliente;
@Repository
public interface ClienteRepository extends CrudRepository <Cliente,Integer> {
public Cliente findById(int cedula);
}
ClienteService.java
package com.example.conexion.service;
import com.example.conexion.entity.Cliente;
import java.util.List;
public interface ClienteService {
public Cliente getClienteById(int id);
public List<Cliente> getAllClientes();
}
ClienteServiceImpl.java
package com.example.conexion.service;
import java.util.ArrayList;
import java.util.List;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.conexion.service.ClienteService;
import com.example.conexion.entity.Cliente;
import com.example.conexion.repository.ClienteRepository;
@Service
@Transactional
public class ClienteServiceImpl implements ClienteService {
private ClienteRepository repository;
public ClienteServiceImpl() {
}
@Autowired
public ClienteServiceImpl(ClienteRepository repository) {
this.repository = repository;
}
@Override
public Cliente getClienteById(int cedula) {
return this.repository.findById(cedula);
}
@Override
public List<Cliente> getAllClientes() {
List<Cliente> list = new ArrayList<>();
repository.findAll().forEach(e -> list.add(e));
return list;
}
}
cliente.xsd
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:tns="http://www.javaspringclub.com/clientes-ws"
targetNamespace="http://www.javaspringclub.com/clientes-ws"
elementFormDefault="qualified">
<xs:element name="getClienteByIdRequest">
<xs:complexType>
<xs:sequence>
<xs:element name="clienteCedula" type="xs:int" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="getClienteByIdResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="clienteType" type="tns:clienteType" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="clienteType">
<xs:sequence>
<xs:element name="cedula" type="xs:int" />
<xs:element name="name" type="xs:string" />
<xs:element name="apellido" type="xs:string" />
<xs:element name="tipo_cliente" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="getAllClientesRequest">
<xs:complexType/>
</xs:element>
<xs:element name="getAllClientesResponse">
<xs:complexType>
<xs:sequence>
<xs:element name="clienteType" type="tns:clienteType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
application.properties
# Oracle settings
spring.datasource.url=jdbc:oracle:thin:@//10.164.7.203:1521/ORCLPDB1.localdomain
spring.datasource.username=cesar
spring.datasource.password=xxxxxx123
spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
spring.jpa.hibernate.ddl-auto=update
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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.example.conexion</groupId>
<artifactId>soap-service-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>soap-service-example</name>
<description>WebService Example</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>wsdl4j</groupId>
<artifactId>wsdl4j</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<version>12.2.0.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<executions>
<execution>
<id>xjc-schema</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<sources>
<source>src/resources/xsd/clientes.xsd</source>
</sources>
<packageName>com.example.conexion.gs_ws</packageName>
<clearOutputDir>false</clearOutputDir>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<!-- Repository for ORACLE JDBC Driver -->
<repository>
<id>codelds</id>
<url>https://code.lds.org/nexus/content/groups/main-repo</url>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
My structure of the project
I am trying to follow this example: https://www.javaspringclub.com/publish-and-consume-soap-web-services-using-spring-boot-part-1/, but to connect to an oracle database that is in a container, and of which I have already tested the connection, I am relatively new to spring boot
Solution 1:[1]
The WSDL portion isn't exactly relevant, but I don't see where you're configuring your repository bean. You need to add a configuration class for it.
For example:
@Configuration
@EntityScan(basePackageClasses = Cliente.class)
@EnableJpaRepositories(basePackageClasses = ClienteRepository.class)
public class ClienteRepositoryConfiguration{}
@EntityScan
is to define what classes represent the data in your database, and @EnableJpaRepositories
defines your repository or repositories.
Solution 2:[2]
Just move main class "SpringApplication" up by one package.
Solution 3:[3]
Annotate your Springboot main class with
@EnableJpaRepositories(basePackages = {"com.mypackage.package.*"})
@ComponentScan(basePackages = { "com.mypackage.package.*" })
@EntityScan(basePackages = {"com.mypackage.package.entity"})
public class SpringApplication {
public static void main(String[] args) {
SpringApplication.run(SpringApplication.class, args);
}
}
Solution 4:[4]
I had similar error message when using MongoRepository from external library. My solution was adding @EnableMongoRepositories(basePackages = "package.of.my.repo")
to my main class.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | Christopher Schneider |
Solution 2 | z atef |
Solution 3 | Panda1667075 |
Solution 4 | stakeika |