'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

enter image description here

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