Initial commit
This commit is contained in:
commit
6481976fd1
144
pom.xml
Normal file
144
pom.xml
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<?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>org.springframework.samples.petclinic.vets</groupId>
|
||||||
|
<artifactId>spring-petclinic-vets-service</artifactId>
|
||||||
|
<packaging>jar</packaging>
|
||||||
|
<description>Spring PetClinic Vets Service</description>
|
||||||
|
|
||||||
|
<parent>
|
||||||
|
<groupId>org.springframework.samples</groupId>
|
||||||
|
<artifactId>spring-petclinic-microservices</artifactId>
|
||||||
|
<version>3.4.1</version>
|
||||||
|
</parent>
|
||||||
|
|
||||||
|
<properties>
|
||||||
|
<docker.image.exposed.port>8081</docker.image.exposed.port>
|
||||||
|
<docker.image.dockerfile.dir>${basedir}/../docker</docker.image.dockerfile.dir>
|
||||||
|
</properties>
|
||||||
|
|
||||||
|
<dependencies>
|
||||||
|
<!-- Spring Boot -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-configuration-processor</artifactId>
|
||||||
|
<optional>true</optional>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-cache</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-data-jpa</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.boot</groupId>
|
||||||
|
<artifactId>spring-boot-starter-test</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Spring Cloud-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-config</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.springframework.cloud</groupId>
|
||||||
|
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Third parties-->
|
||||||
|
<dependency>
|
||||||
|
<groupId>javax.cache</groupId>
|
||||||
|
<artifactId>cache-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>jakarta.xml.bind</groupId>
|
||||||
|
<artifactId>jakarta.xml.bind-api</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.github.ben-manes.caffeine</groupId>
|
||||||
|
<artifactId>caffeine</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.jolokia</groupId>
|
||||||
|
<artifactId>jolokia-core</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.hsqldb</groupId>
|
||||||
|
<artifactId>hsqldb</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.mysql</groupId>
|
||||||
|
<artifactId>mysql-connector-j</artifactId>
|
||||||
|
<scope>runtime</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.micrometer</groupId>
|
||||||
|
<artifactId>micrometer-registry-prometheus</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>de.codecentric</groupId>
|
||||||
|
<artifactId>chaos-monkey-spring-boot</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.opentelemetry</groupId>
|
||||||
|
<artifactId>opentelemetry-exporter-zipkin</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.micrometer</groupId>
|
||||||
|
<artifactId>micrometer-observation</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.micrometer</groupId>
|
||||||
|
<artifactId>micrometer-tracing-bridge-brave</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>io.zipkin.reporter2</groupId>
|
||||||
|
<artifactId>zipkin-reporter-brave</artifactId>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>net.ttddyy.observation</groupId>
|
||||||
|
<artifactId>datasource-micrometer-spring-boot</artifactId>
|
||||||
|
<version>1.0.2</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
<!-- Testing -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-api</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>org.junit.jupiter</groupId>
|
||||||
|
<artifactId>junit-jupiter-engine</artifactId>
|
||||||
|
<scope>test</scope>
|
||||||
|
</dependency>
|
||||||
|
</dependencies>
|
||||||
|
|
||||||
|
<profiles>
|
||||||
|
<profile>
|
||||||
|
<id>buildDocker</id>
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.codehaus.mojo</groupId>
|
||||||
|
<artifactId>exec-maven-plugin</artifactId>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
</profile>
|
||||||
|
</profiles>
|
||||||
|
</project>
|
||||||
@ -0,0 +1,35 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.samples.petclinic.vets;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
|
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
|
||||||
|
import org.springframework.samples.petclinic.vets.system.VetsProperties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Maciej Szarlinski
|
||||||
|
*/
|
||||||
|
@EnableDiscoveryClient
|
||||||
|
@SpringBootApplication
|
||||||
|
@EnableConfigurationProperties(VetsProperties.class)
|
||||||
|
public class VetsServiceApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(VetsServiceApplication.class, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.samples.petclinic.vets.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Models a {@link Vet Vet's} specialty (for example, dentistry).
|
||||||
|
*
|
||||||
|
* @author Juergen Hoeller
|
||||||
|
* @author Ramazan Sakin
|
||||||
|
*/
|
||||||
|
|
||||||
|
@Entity
|
||||||
|
@Table(name = "specialties")
|
||||||
|
public class Specialty {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@Column(name = "name")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return this.name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,102 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.samples.petclinic.vets.model;
|
||||||
|
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import jakarta.xml.bind.annotation.XmlElement;
|
||||||
|
import org.springframework.beans.support.MutableSortDefinition;
|
||||||
|
import org.springframework.beans.support.PropertyComparator;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple JavaBean domain object representing a veterinarian.
|
||||||
|
*
|
||||||
|
* @author Ken Krebs
|
||||||
|
* @author Juergen Hoeller
|
||||||
|
* @author Sam Brannen
|
||||||
|
* @author Arjen Poutsma
|
||||||
|
* @author Maciej Szarlinski
|
||||||
|
* @author Ramazan Sakin
|
||||||
|
*/
|
||||||
|
@Entity
|
||||||
|
@Table(name = "vets")
|
||||||
|
public class Vet {
|
||||||
|
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Integer id;
|
||||||
|
|
||||||
|
@Column(name = "first_name")
|
||||||
|
@NotBlank
|
||||||
|
private String firstName;
|
||||||
|
|
||||||
|
@Column(name = "last_name")
|
||||||
|
@NotBlank
|
||||||
|
private String lastName;
|
||||||
|
|
||||||
|
@ManyToMany(fetch = FetchType.EAGER)
|
||||||
|
@JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"),
|
||||||
|
inverseJoinColumns = @JoinColumn(name = "specialty_id"))
|
||||||
|
private Set<Specialty> specialties;
|
||||||
|
|
||||||
|
protected Set<Specialty> getSpecialtiesInternal() {
|
||||||
|
if (this.specialties == null) {
|
||||||
|
this.specialties = new HashSet<>();
|
||||||
|
}
|
||||||
|
return this.specialties;
|
||||||
|
}
|
||||||
|
|
||||||
|
@XmlElement
|
||||||
|
public List<Specialty> getSpecialties() {
|
||||||
|
List<Specialty> sortedSpecs = new ArrayList<>(getSpecialtiesInternal());
|
||||||
|
PropertyComparator.sort(sortedSpecs, new MutableSortDefinition("name", true, true));
|
||||||
|
return Collections.unmodifiableList(sortedSpecs);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNrOfSpecialties() {
|
||||||
|
return getSpecialtiesInternal().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addSpecialty(Specialty specialty) {
|
||||||
|
getSpecialtiesInternal().add(specialty);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return this.id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstName() {
|
||||||
|
return this.firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastName() {
|
||||||
|
return this.lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastName(String lastName) {
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.samples.petclinic.vets.model;
|
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Repository class for <code>Vet</code> domain objects All method names are compliant with Spring Data naming
|
||||||
|
* conventions so this interface can easily be extended for Spring Data See here: http://static.springsource.org/spring-data/jpa/docs/current/reference/html/jpa.repositories.html#jpa.query-methods.query-creation
|
||||||
|
*
|
||||||
|
* @author Ken Krebs
|
||||||
|
* @author Juergen Hoeller
|
||||||
|
* @author Sam Brannen
|
||||||
|
* @author Michael Isvy
|
||||||
|
* @author Maciej Szarlinski
|
||||||
|
*/
|
||||||
|
public interface VetRepository extends JpaRepository<Vet, Integer> {
|
||||||
|
}
|
||||||
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.samples.petclinic.vets.system;
|
||||||
|
|
||||||
|
import org.springframework.cache.annotation.EnableCaching;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache could be disable in unit test.
|
||||||
|
* @author Maciej Szarlinski
|
||||||
|
*/
|
||||||
|
@Configuration
|
||||||
|
@EnableCaching
|
||||||
|
@Profile("production")
|
||||||
|
class CacheConfig {
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.samples.petclinic.vets.system;
|
||||||
|
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Typesafe custom configuration.
|
||||||
|
*
|
||||||
|
* @author Maciej Szarlinski
|
||||||
|
*/
|
||||||
|
@ConfigurationProperties(prefix = "vets")
|
||||||
|
public record VetsProperties(
|
||||||
|
Cache cache
|
||||||
|
) {
|
||||||
|
public record Cache(
|
||||||
|
int ttl,
|
||||||
|
int heapSize
|
||||||
|
) {
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.samples.petclinic.vets.web;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.springframework.cache.annotation.Cacheable;
|
||||||
|
import org.springframework.samples.petclinic.vets.model.Vet;
|
||||||
|
import org.springframework.samples.petclinic.vets.model.VetRepository;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Juergen Hoeller
|
||||||
|
* @author Mark Fisher
|
||||||
|
* @author Ken Krebs
|
||||||
|
* @author Arjen Poutsma
|
||||||
|
* @author Maciej Szarlinski
|
||||||
|
*/
|
||||||
|
@RequestMapping("/vets")
|
||||||
|
@RestController
|
||||||
|
class VetResource {
|
||||||
|
|
||||||
|
private final VetRepository vetRepository;
|
||||||
|
|
||||||
|
VetResource(VetRepository vetRepository) {
|
||||||
|
this.vetRepository = vetRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping
|
||||||
|
@Cacheable("vets")
|
||||||
|
public List<Vet> showResourcesVetList() {
|
||||||
|
return vetRepository.findAll();
|
||||||
|
}
|
||||||
|
}
|
||||||
16
src/main/resources/application.yml
Normal file
16
src/main/resources/application.yml
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
spring:
|
||||||
|
application:
|
||||||
|
name: vets-service
|
||||||
|
config:
|
||||||
|
import: optional:configserver:${CONFIG_SERVER_URL:http://localhost:8888/}
|
||||||
|
cache:
|
||||||
|
cache-names: vets
|
||||||
|
profiles:
|
||||||
|
active: production
|
||||||
|
|
||||||
|
---
|
||||||
|
spring:
|
||||||
|
config:
|
||||||
|
activate:
|
||||||
|
on-profile: docker
|
||||||
|
import: configserver:http://config-server:8888
|
||||||
16
src/main/resources/db/hsqldb/data.sql
Normal file
16
src/main/resources/db/hsqldb/data.sql
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
INSERT INTO vets VALUES (1, 'James', 'Carter');
|
||||||
|
INSERT INTO vets VALUES (2, 'Helen', 'Leary');
|
||||||
|
INSERT INTO vets VALUES (3, 'Linda', 'Douglas');
|
||||||
|
INSERT INTO vets VALUES (4, 'Rafael', 'Ortega');
|
||||||
|
INSERT INTO vets VALUES (5, 'Henry', 'Stevens');
|
||||||
|
INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins');
|
||||||
|
|
||||||
|
INSERT INTO specialties VALUES (1, 'radiology');
|
||||||
|
INSERT INTO specialties VALUES (2, 'surgery');
|
||||||
|
INSERT INTO specialties VALUES (3, 'dentistry');
|
||||||
|
|
||||||
|
INSERT INTO vet_specialties VALUES (2, 1);
|
||||||
|
INSERT INTO vet_specialties VALUES (3, 2);
|
||||||
|
INSERT INTO vet_specialties VALUES (3, 3);
|
||||||
|
INSERT INTO vet_specialties VALUES (4, 2);
|
||||||
|
INSERT INTO vet_specialties VALUES (5, 1);
|
||||||
23
src/main/resources/db/hsqldb/schema.sql
Normal file
23
src/main/resources/db/hsqldb/schema.sql
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
DROP TABLE vet_specialties IF EXISTS;
|
||||||
|
DROP TABLE vets IF EXISTS;
|
||||||
|
DROP TABLE specialties IF EXISTS;
|
||||||
|
|
||||||
|
CREATE TABLE vets (
|
||||||
|
id INTEGER IDENTITY PRIMARY KEY,
|
||||||
|
first_name VARCHAR(30),
|
||||||
|
last_name VARCHAR(30)
|
||||||
|
);
|
||||||
|
CREATE INDEX vets_last_name ON vets (last_name);
|
||||||
|
|
||||||
|
CREATE TABLE specialties (
|
||||||
|
id INTEGER IDENTITY PRIMARY KEY,
|
||||||
|
name VARCHAR(80)
|
||||||
|
);
|
||||||
|
CREATE INDEX specialties_name ON specialties (name);
|
||||||
|
|
||||||
|
CREATE TABLE vet_specialties (
|
||||||
|
vet_id INTEGER NOT NULL,
|
||||||
|
specialty_id INTEGER NOT NULL
|
||||||
|
);
|
||||||
|
ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id);
|
||||||
|
ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id);
|
||||||
16
src/main/resources/db/mysql/data.sql
Normal file
16
src/main/resources/db/mysql/data.sql
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
INSERT IGNORE INTO vets VALUES (1, 'James', 'Carter');
|
||||||
|
INSERT IGNORE INTO vets VALUES (2, 'Helen', 'Leary');
|
||||||
|
INSERT IGNORE INTO vets VALUES (3, 'Linda', 'Douglas');
|
||||||
|
INSERT IGNORE INTO vets VALUES (4, 'Rafael', 'Ortega');
|
||||||
|
INSERT IGNORE INTO vets VALUES (5, 'Henry', 'Stevens');
|
||||||
|
INSERT IGNORE INTO vets VALUES (6, 'Sharon', 'Jenkins');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO specialties VALUES (1, 'radiology');
|
||||||
|
INSERT IGNORE INTO specialties VALUES (2, 'surgery');
|
||||||
|
INSERT IGNORE INTO specialties VALUES (3, 'dentistry');
|
||||||
|
|
||||||
|
INSERT IGNORE INTO vet_specialties VALUES (2, 1);
|
||||||
|
INSERT IGNORE INTO vet_specialties VALUES (3, 2);
|
||||||
|
INSERT IGNORE INTO vet_specialties VALUES (3, 3);
|
||||||
|
INSERT IGNORE INTO vet_specialties VALUES (4, 2);
|
||||||
|
INSERT IGNORE INTO vet_specialties VALUES (5, 1);
|
||||||
24
src/main/resources/db/mysql/schema.sql
Normal file
24
src/main/resources/db/mysql/schema.sql
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
CREATE DATABASE IF NOT EXISTS petclinic;
|
||||||
|
|
||||||
|
USE petclinic;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS vets (
|
||||||
|
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
first_name VARCHAR(30),
|
||||||
|
last_name VARCHAR(30),
|
||||||
|
INDEX(last_name)
|
||||||
|
) engine=InnoDB;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS specialties (
|
||||||
|
id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||||
|
name VARCHAR(80),
|
||||||
|
INDEX(name)
|
||||||
|
) engine=InnoDB;
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS vet_specialties (
|
||||||
|
vet_id INT(4) UNSIGNED NOT NULL,
|
||||||
|
specialty_id INT(4) UNSIGNED NOT NULL,
|
||||||
|
FOREIGN KEY (vet_id) REFERENCES vets(id),
|
||||||
|
FOREIGN KEY (specialty_id) REFERENCES specialties(id),
|
||||||
|
UNIQUE (vet_id,specialty_id)
|
||||||
|
) engine=InnoDB;
|
||||||
6
src/main/resources/logback-spring.xml
Normal file
6
src/main/resources/logback-spring.xml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<configuration>
|
||||||
|
<include resource="org/springframework/boot/logging/logback/base.xml"/>
|
||||||
|
<!-- Required for Loglevel managment into the Spring Petclinic Admin Server-->
|
||||||
|
<jmxConfigurator/>
|
||||||
|
</configuration>
|
||||||
@ -0,0 +1,62 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2002-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.samples.petclinic.vets.web;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
|
||||||
|
import org.springframework.boot.test.mock.mockito.MockBean;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.samples.petclinic.vets.model.Vet;
|
||||||
|
import org.springframework.samples.petclinic.vets.model.VetRepository;
|
||||||
|
import org.springframework.test.context.ActiveProfiles;
|
||||||
|
import org.springframework.test.context.junit.jupiter.SpringExtension;
|
||||||
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
|
||||||
|
import static java.util.Arrays.asList;
|
||||||
|
import static org.mockito.BDDMockito.given;
|
||||||
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Maciej Szarlinski
|
||||||
|
*/
|
||||||
|
@ExtendWith(SpringExtension.class)
|
||||||
|
@WebMvcTest(VetResource.class)
|
||||||
|
@ActiveProfiles("test")
|
||||||
|
class VetResourceTest {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
MockMvc mvc;
|
||||||
|
|
||||||
|
@MockBean
|
||||||
|
VetRepository vetRepository;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void shouldGetAListOfVets() throws Exception {
|
||||||
|
|
||||||
|
Vet vet = new Vet();
|
||||||
|
vet.setId(1);
|
||||||
|
|
||||||
|
given(vetRepository.findAll()).willReturn(asList(vet));
|
||||||
|
|
||||||
|
mvc.perform(get("/vets").accept(MediaType.APPLICATION_JSON))
|
||||||
|
.andExpect(status().isOk())
|
||||||
|
.andExpect(jsonPath("$[0].id").value(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
20
src/test/resources/application-test.yml
Normal file
20
src/test/resources/application-test.yml
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
spring:
|
||||||
|
cloud:
|
||||||
|
config:
|
||||||
|
enabled: false
|
||||||
|
sql:
|
||||||
|
init:
|
||||||
|
schema-locations: classpath*:db/hsqldb/schema.sql
|
||||||
|
data-locations: classpath*:db/hsqldb/data.sql
|
||||||
|
jpa:
|
||||||
|
hibernate:
|
||||||
|
ddl-auto: none
|
||||||
|
|
||||||
|
eureka:
|
||||||
|
client:
|
||||||
|
enabled: false
|
||||||
|
|
||||||
|
vets:
|
||||||
|
cache:
|
||||||
|
ttl: 10
|
||||||
|
heap-size: 10
|
||||||
Loading…
x
Reference in New Issue
Block a user