├── .gitignore ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── README.adoc ├── auto ├── pom.xml └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── springframework │ │ │ └── boot │ │ │ └── reflect │ │ │ ├── AutoConfigurations.java │ │ │ ├── AutoInitializer.java │ │ │ ├── AutoListener.java │ │ │ ├── AutoRegistrar.java │ │ │ ├── AutoTestContextLoader.java │ │ │ ├── BeansInitializer.java │ │ │ ├── ConditionEvaluator.java │ │ │ └── SpringApplication.java │ └── resources │ │ └── META-INF │ │ └── spring.factories │ └── test │ └── java │ └── com │ └── example │ ├── auto │ ├── AutoApplication.java │ └── AutoApplicationTests.java │ └── demo │ ├── DemoApplication.java │ └── FuncsApplicationTests.java ├── mvnw ├── mvnw.cmd ├── pom.xml └── samples ├── cloud ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ ├── auto │ │ │ └── AutoApplication.java │ │ │ └── demo │ │ │ └── DemoApplication.java │ └── resources │ │ ├── application.properties │ │ └── db │ │ └── hsqldb │ │ ├── data.sql │ │ └── schema.sql │ └── test │ └── java │ └── com │ └── example │ └── auto │ ├── AutoApplicationTests.java │ └── MockApplicationTests.java ├── demo ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ ├── auto │ │ │ └── AutoApplication.java │ │ │ └── demo │ │ │ └── DemoApplication.java │ └── resources │ │ ├── application.properties │ │ └── db │ │ └── hsqldb │ │ ├── data.sql │ │ └── schema.sql │ └── test │ └── java │ └── com │ └── example │ └── auto │ ├── AutoApplicationTests.java │ └── MockApplicationTests.java ├── empty ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ ├── auto │ │ │ └── AutoApplication.java │ │ │ └── demo │ │ │ └── DemoApplication.java │ └── resources │ │ ├── application.properties │ │ └── db │ │ └── hsqldb │ │ ├── data.sql │ │ └── schema.sql │ └── test │ └── java │ └── com │ └── example │ └── auto │ └── AutoApplicationTests.java ├── mvc ├── pom.xml └── src │ ├── main │ ├── java │ │ └── com │ │ │ └── example │ │ │ ├── auto │ │ │ └── AutoApplication.java │ │ │ └── demo │ │ │ └── DemoApplication.java │ └── resources │ │ ├── application.properties │ │ └── db │ │ └── hsqldb │ │ ├── data.sql │ │ └── schema.sql │ └── test │ └── java │ └── com │ └── example │ └── auto │ └── AutoApplicationTests.java ├── petclinic ├── docker-compose.yml ├── pom.xml ├── readme.md └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── springframework │ │ │ └── samples │ │ │ └── petclinic │ │ │ ├── PetClinicApplication.java │ │ │ ├── model │ │ │ ├── BaseEntity.java │ │ │ ├── NamedEntity.java │ │ │ ├── Person.java │ │ │ └── package-info.java │ │ │ ├── owner │ │ │ ├── Owner.java │ │ │ ├── OwnerController.java │ │ │ ├── OwnerRepository.java │ │ │ ├── Pet.java │ │ │ ├── PetController.java │ │ │ ├── PetRepository.java │ │ │ ├── PetType.java │ │ │ ├── PetTypeFormatter.java │ │ │ ├── PetValidator.java │ │ │ └── VisitController.java │ │ │ ├── system │ │ │ ├── CacheConfiguration.java │ │ │ ├── CrashController.java │ │ │ └── WelcomeController.java │ │ │ ├── vet │ │ │ ├── Specialty.java │ │ │ ├── Vet.java │ │ │ ├── VetController.java │ │ │ ├── VetRepository.java │ │ │ └── Vets.java │ │ │ └── visit │ │ │ ├── Visit.java │ │ │ └── VisitRepository.java │ ├── less │ │ ├── header.less │ │ ├── petclinic.less │ │ ├── responsive.less │ │ └── typography.less │ ├── resources │ │ ├── application-mysql.properties │ │ ├── application.properties │ │ ├── banner.txt │ │ ├── db │ │ │ ├── hsqldb │ │ │ │ ├── data.sql │ │ │ │ └── schema.sql │ │ │ └── mysql │ │ │ │ ├── data.sql │ │ │ │ ├── petclinic_db_setup_mysql.txt │ │ │ │ └── schema.sql │ │ ├── messages │ │ │ ├── messages.properties │ │ │ ├── messages_de.properties │ │ │ └── messages_en.properties │ │ ├── static │ │ │ └── resources │ │ │ │ ├── fonts │ │ │ │ ├── montserrat-webfont.eot │ │ │ │ ├── montserrat-webfont.svg │ │ │ │ ├── montserrat-webfont.ttf │ │ │ │ ├── montserrat-webfont.woff │ │ │ │ ├── varela_round-webfont.eot │ │ │ │ ├── varela_round-webfont.svg │ │ │ │ ├── varela_round-webfont.ttf │ │ │ │ └── varela_round-webfont.woff │ │ │ │ └── images │ │ │ │ ├── favicon.png │ │ │ │ ├── pets.png │ │ │ │ ├── platform-bg.png │ │ │ │ ├── spring-logo-dataflow-mobile.png │ │ │ │ ├── spring-logo-dataflow.png │ │ │ │ └── spring-pivotal-logo.png │ │ └── templates │ │ │ ├── error.html │ │ │ ├── fragments │ │ │ ├── inputField.html │ │ │ ├── layout.html │ │ │ └── selectField.html │ │ │ ├── owners │ │ │ ├── createOrUpdateOwnerForm.html │ │ │ ├── findOwners.html │ │ │ ├── ownerDetails.html │ │ │ └── ownersList.html │ │ │ ├── pets │ │ │ ├── createOrUpdatePetForm.html │ │ │ └── createOrUpdateVisitForm.html │ │ │ ├── vets │ │ │ └── vetList.html │ │ │ └── welcome.html │ └── wro │ │ ├── wro.properties │ │ └── wro.xml │ └── test │ ├── java │ └── org │ │ └── springframework │ │ └── samples │ │ └── petclinic │ │ ├── PetclinicIntegrationTests.java │ │ ├── model │ │ └── ValidatorTests.java │ │ ├── owner │ │ ├── OwnerControllerTests.java │ │ ├── PetControllerTests.java │ │ ├── PetTypeFormatterTests.java │ │ └── VisitControllerTests.java │ │ ├── service │ │ ├── ClinicServiceTests.java │ │ └── EntityUtils.java │ │ ├── system │ │ └── CrashControllerTests.java │ │ └── vet │ │ ├── VetControllerTests.java │ │ └── VetTests.java │ └── jmeter │ └── petclinic_test_plan.jmx └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !**/src/main/** 3 | !**/src/test/** 4 | !.mvn/wrapper/maven-wrapper.jar 5 | 6 | ### STS ### 7 | .apt_generated 8 | .classpath 9 | .factorypath 10 | .project 11 | .settings 12 | .springBeans 13 | .sts4-cache 14 | .attach_* 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /build/ 25 | /nbbuild/ 26 | /dist/ 27 | /nbdist/ 28 | /.nb-gradle/ 29 | -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.3/apache-maven-3.5.3-bin.zip 2 | -------------------------------------------------------------------------------- /README.adoc: -------------------------------------------------------------------------------- 1 | This project creates functional bean definitions from Spring Boot 2 | autoconfigurations. It's really (surprisingly) fast. 3 | 4 | To use it include the library on your classpath: 5 | 6 | ``` 7 | 8 | org.springframework.boot.experimental 9 | spring-boot-auto-reflect 10 | 1.0.0.BUILD-SNAPSHOT 11 | 12 | ``` 13 | 14 | Create your Spring Boot application as an 15 | `ApplicationContextInitializer` and register beans in the `initialize()` 16 | method, e.g. 17 | 18 | ```java 19 | @RestController 20 | public class AutoApplication 21 | implements ApplicationContextInitializer { 22 | 23 | @GetMapping 24 | public String home() { 25 | return "Hello"; 26 | } 27 | 28 | @Override 29 | public void initialize(GenericApplicationContext context) { 30 | context.registerBean(AutoApplication.class, () -> this); 31 | } 32 | 33 | } 34 | ``` 35 | 36 | then use the custom `SpringApplication` class from this library 37 | instead of the default one to launch your app, as normal: 38 | 39 | ```java 40 | public static void main(String[] args) throws Exception { 41 | SpringApplication.run(AutoApplication.class, args); 42 | } 43 | ``` 44 | 45 | Instead of using an `ApplicationContextInitializer` you can use the 46 | regular `@SpringBootApplication` and `@Configuration` programming 47 | model in your own classes, and set `spring.functional.enabled=true` 48 | (e.g. as a System property). Be sure to use the custom 49 | `SpringApplication` class though if you do that. 50 | 51 | For integration tests use the test context loader from this library. E.g: 52 | 53 | ```java 54 | @RunWith(SpringRunner.class) 55 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 56 | @ContextConfiguration(classes = AutoApplication.class, loader = AutoTestContextLoader.class) 57 | public class AutoApplicationTests { 58 | 59 | @Autowired 60 | private WebTestClient rest; 61 | 62 | @Test 63 | public void contextLoads() { 64 | rest.get().uri("/").exchange().expectBody(String.class).isEqualTo("Hello"); 65 | } 66 | 67 | } 68 | 69 | ``` 70 | 71 | Unsupported: test slices (`@WebMvcTest` etc.) and `@AutoConfigure*` 72 | annotations in tests. -------------------------------------------------------------------------------- /auto/src/main/java/org/springframework/boot/reflect/AutoConfigurations.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.springframework.boot.reflect; 18 | 19 | import java.lang.annotation.Documented; 20 | import java.lang.annotation.ElementType; 21 | import java.lang.annotation.Inherited; 22 | import java.lang.annotation.Retention; 23 | import java.lang.annotation.RetentionPolicy; 24 | import java.lang.annotation.Target; 25 | 26 | import org.springframework.beans.BeansException; 27 | import org.springframework.beans.factory.BeanCreationException; 28 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; 29 | import org.springframework.beans.factory.support.BeanDefinitionRegistry; 30 | import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; 31 | import org.springframework.boot.autoconfigure.AutoConfigurationImportSelector; 32 | import org.springframework.boot.autoconfigure.AutoConfigurationPackage; 33 | import org.springframework.boot.reflect.AutoConfigurations.EnableActuatorAutoConfigurations; 34 | import org.springframework.context.annotation.Configuration; 35 | import org.springframework.context.support.GenericApplicationContext; 36 | import org.springframework.core.type.StandardAnnotationMetadata; 37 | import org.springframework.util.ClassUtils; 38 | 39 | @Configuration 40 | @EnableActuatorAutoConfigurations 41 | class AutoConfigurations extends AutoConfigurationImportSelector 42 | implements BeanDefinitionRegistryPostProcessor { 43 | 44 | private GenericApplicationContext context; 45 | 46 | public AutoConfigurations(GenericApplicationContext applicationContext) { 47 | this.context = applicationContext; 48 | setBeanFactory(applicationContext.getDefaultListableBeanFactory()); 49 | setBeanClassLoader(applicationContext.getClassLoader()); 50 | setEnvironment(applicationContext.getEnvironment()); 51 | setResourceLoader(applicationContext); 52 | } 53 | 54 | public Class[] config() { 55 | String[] imports = selectImports( 56 | new StandardAnnotationMetadata(AutoConfigurations.class)); 57 | Class[] types = new Class[imports.length]; 58 | int i = 0; 59 | for (String config : imports) { 60 | Class type = ClassUtils.resolveClassName(config, getBeanClassLoader()); 61 | types[i++] = type; 62 | } 63 | org.springframework.boot.autoconfigure.AutoConfigurations autos = org.springframework.boot.autoconfigure.AutoConfigurations 64 | .of(types); 65 | return org.springframework.boot.autoconfigure.AutoConfigurations 66 | .getClasses(autos); 67 | } 68 | 69 | @Target(ElementType.TYPE) 70 | @Retention(RetentionPolicy.RUNTIME) 71 | @Documented 72 | @Inherited 73 | @AutoConfigurationPackage 74 | static @interface EnableActuatorAutoConfigurations { 75 | Class[] exclude() default {}; 76 | 77 | String[] excludeName() default {}; 78 | } 79 | 80 | @Override 81 | protected Class getAnnotationClass() { 82 | return EnableActuatorAutoConfigurations.class; 83 | } 84 | 85 | @Override 86 | public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) 87 | throws BeansException { 88 | } 89 | 90 | @Override 91 | public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) 92 | throws BeansException { 93 | try { 94 | register(registry, this.context.getDefaultListableBeanFactory()); 95 | } 96 | catch (BeansException e) { 97 | throw e; 98 | } 99 | catch (RuntimeException e) { 100 | throw e; 101 | } 102 | catch (Exception e) { 103 | throw new BeanCreationException("Cannot register from " + getClass(), e); 104 | } 105 | } 106 | 107 | protected void register(BeanDefinitionRegistry registry, 108 | ConfigurableListableBeanFactory factory) throws Exception { 109 | AutoRegistrar registrar = new AutoRegistrar(registry, factory, getEnvironment(), 110 | getResourceLoader()); 111 | for (Class type : config()) { 112 | registrar.register(type); 113 | } 114 | } 115 | 116 | } -------------------------------------------------------------------------------- /auto/src/main/java/org/springframework/boot/reflect/AutoInitializer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.boot.reflect; 17 | 18 | import org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor; 19 | import org.springframework.beans.factory.support.DefaultListableBeanFactory; 20 | import org.springframework.boot.autoconfigure.AutoConfigurationPackages; 21 | import org.springframework.boot.context.properties.ConfigurationBeanFactoryMetadata; 22 | import org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor; 23 | import org.springframework.context.ApplicationContextInitializer; 24 | import org.springframework.context.annotation.ContextAnnotationAutowireCandidateResolver; 25 | import org.springframework.context.support.GenericApplicationContext; 26 | import org.springframework.core.annotation.AnnotationAwareOrderComparator; 27 | import org.springframework.util.ClassUtils; 28 | 29 | /** 30 | * @author Dave Syer 31 | * 32 | */ 33 | public class AutoInitializer 34 | implements ApplicationContextInitializer { 35 | 36 | private Class type; 37 | 38 | public AutoInitializer(Class type) { 39 | this.type = type; 40 | } 41 | 42 | @Override 43 | public void initialize(GenericApplicationContext context) { 44 | AutoConfigurationPackages.register(context, ClassUtils.getPackageName(this.type)); 45 | DefaultListableBeanFactory beanFactory = context.getDefaultListableBeanFactory(); 46 | if (beanFactory != null) { 47 | if (!(beanFactory 48 | .getDependencyComparator() instanceof AnnotationAwareOrderComparator)) { 49 | beanFactory 50 | .setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE); 51 | } 52 | if (!(beanFactory 53 | .getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) { 54 | beanFactory.setAutowireCandidateResolver( 55 | new ContextAnnotationAutowireCandidateResolver()); 56 | } 57 | beanFactory.addBeanPostProcessor( 58 | beanFactory.createBean(AutowiredAnnotationBeanPostProcessor.class)); 59 | } 60 | context.registerBean(ConfigurationPropertiesBindingPostProcessor.class); 61 | context.registerBean(ConfigurationBeanFactoryMetadata.BEAN_NAME, 62 | ConfigurationBeanFactoryMetadata.class); 63 | context.addBeanFactoryPostProcessor(new AutoConfigurations(context)); 64 | } 65 | 66 | } 67 | -------------------------------------------------------------------------------- /auto/src/main/java/org/springframework/boot/reflect/AutoListener.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.boot.reflect; 17 | 18 | import org.springframework.beans.BeanUtils; 19 | import org.springframework.boot.SpringApplication; 20 | import org.springframework.boot.WebApplicationType; 21 | import org.springframework.boot.context.event.ApplicationStartingEvent; 22 | import org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext; 23 | import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext; 24 | import org.springframework.context.ApplicationContextInitializer; 25 | import org.springframework.context.ApplicationEvent; 26 | import org.springframework.context.event.SmartApplicationListener; 27 | import org.springframework.context.support.GenericApplicationContext; 28 | import org.springframework.core.env.StandardEnvironment; 29 | 30 | /** 31 | * Listener that sets up an {@link ApplicationContextInitializer} to register functional 32 | * beans. Activates when the {@link SpringApplication} has a source that is an 33 | * ApplicationContextInitializer. 34 | * 35 | * @author Dave Syer 36 | * 37 | */ 38 | public class AutoListener implements SmartApplicationListener { 39 | 40 | private StandardEnvironment environment = new StandardEnvironment(); 41 | 42 | @Override 43 | public void onApplicationEvent(ApplicationEvent event) { 44 | ApplicationStartingEvent starting = (ApplicationStartingEvent) event; 45 | SpringApplication application = starting.getSpringApplication(); 46 | boolean initialized = false; 47 | for (Object source : application.getAllSources()) { 48 | Class type = null; 49 | if (source instanceof Class) { 50 | type = (Class) source; 51 | } 52 | if (!initialized && isFunctional(type)) { 53 | WebApplicationType webApplicationType = application 54 | .getWebApplicationType(); 55 | if (webApplicationType == WebApplicationType.REACTIVE) { 56 | application.setApplicationContextClass( 57 | ReactiveWebServerApplicationContext.class); 58 | } 59 | else if (webApplicationType == WebApplicationType.SERVLET) { 60 | application.setApplicationContextClass( 61 | ServletWebServerApplicationContext.class); 62 | } 63 | else { 64 | application 65 | .setApplicationContextClass(GenericApplicationContext.class); 66 | } 67 | application.addInitializers(new AutoInitializer(type)); 68 | initialized = true; 69 | } 70 | if (isInitializer(type)) { 71 | application.addInitializers(BeanUtils.instantiateClass(type, 72 | ApplicationContextInitializer.class)); 73 | } else { 74 | application.addInitializers(new BeansInitializer(type)); 75 | } 76 | } 77 | } 78 | 79 | private boolean isFunctional(Class type) { 80 | if (environment.getProperty("spring.functional.enabled", Boolean.class, false)) { 81 | return true; 82 | } 83 | return isInitializer(type); 84 | } 85 | 86 | private boolean isInitializer(Class type) { 87 | return ApplicationContextInitializer.class.isAssignableFrom(type) && !type 88 | .getName().startsWith("org.springframework.cloud.bootstrap"); 89 | } 90 | 91 | @Override 92 | public int getOrder() { 93 | return 0; 94 | } 95 | 96 | @Override 97 | public boolean supportsEventType(Class eventType) { 98 | return ApplicationStartingEvent.class.isAssignableFrom(eventType); 99 | } 100 | 101 | @Override 102 | public boolean supportsSourceType(Class sourceType) { 103 | return SpringApplication.class.isAssignableFrom(sourceType); 104 | } 105 | 106 | } 107 | -------------------------------------------------------------------------------- /auto/src/main/java/org/springframework/boot/reflect/AutoTestContextLoader.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.boot.reflect; 17 | 18 | import org.springframework.boot.SpringApplication; 19 | import org.springframework.boot.test.context.SpringBootContextLoader; 20 | 21 | /** 22 | * @author Dave Syer 23 | * 24 | */ 25 | public class AutoTestContextLoader extends SpringBootContextLoader { 26 | 27 | @Override 28 | protected SpringApplication getSpringApplication() { 29 | return new org.springframework.boot.reflect.SpringApplication(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /auto/src/main/java/org/springframework/boot/reflect/BeansInitializer.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.springframework.boot.reflect; 18 | 19 | import org.springframework.context.ApplicationContextInitializer; 20 | import org.springframework.context.support.GenericApplicationContext; 21 | 22 | /** 23 | * @author Dave Syer 24 | * 25 | */ 26 | public class BeansInitializer 27 | implements ApplicationContextInitializer { 28 | 29 | private Class type; 30 | 31 | public BeansInitializer(Class type) { 32 | this.type = type; 33 | } 34 | 35 | @Override 36 | public void initialize(GenericApplicationContext context) { 37 | new AutoRegistrar(context, context.getDefaultListableBeanFactory(), 38 | context.getEnvironment(), context).register(type); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /auto/src/main/java/org/springframework/boot/reflect/SpringApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.boot.reflect; 17 | 18 | import org.springframework.context.ApplicationContext; 19 | import org.springframework.context.ConfigurableApplicationContext; 20 | 21 | /** 22 | * @author Dave Syer 23 | * 24 | */ 25 | public class SpringApplication extends org.springframework.boot.SpringApplication { 26 | 27 | public SpringApplication() { 28 | super(); 29 | } 30 | 31 | public SpringApplication(Class[] primarySources) { 32 | super(primarySources); 33 | } 34 | 35 | public static ConfigurableApplicationContext run(Class primarySource, 36 | String... args) { 37 | return run(new Class[] { primarySource }, args); 38 | } 39 | 40 | public static ConfigurableApplicationContext run(Class[] primarySources, 41 | String[] args) { 42 | return new SpringApplication(primarySources).run(args); 43 | } 44 | 45 | public static void main(String[] args) throws Exception { 46 | SpringApplication.run(new Class[0], args); 47 | } 48 | 49 | @Override 50 | protected void load(ApplicationContext context, Object[] sources) { 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /auto/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.context.ApplicationListener=\ 2 | org.springframework.boot.reflect.AutoListener -------------------------------------------------------------------------------- /auto/src/test/java/com/example/auto/AutoApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.auto; 17 | 18 | import org.springframework.beans.factory.annotation.Value; 19 | import org.springframework.boot.reflect.SpringApplication; 20 | import org.springframework.context.ApplicationContextInitializer; 21 | import org.springframework.context.support.GenericApplicationContext; 22 | import org.springframework.web.bind.annotation.GetMapping; 23 | import org.springframework.web.bind.annotation.RestController; 24 | 25 | /** 26 | * @author Dave Syer 27 | * 28 | */ 29 | @RestController 30 | public class AutoApplication 31 | implements ApplicationContextInitializer { 32 | 33 | public static final String MARKER = "Benchmark app started"; 34 | 35 | @Value("${greeting:Hello}") 36 | private String greeting; 37 | 38 | @GetMapping 39 | public String home() { 40 | return greeting; 41 | } 42 | 43 | public static void main(String[] args) throws Exception { 44 | SpringApplication.run(AutoApplication.class, args); 45 | System.err.println(MARKER); 46 | } 47 | 48 | @Override 49 | public void initialize(GenericApplicationContext context) { 50 | context.registerBean(AutoApplication.class, () -> this); 51 | } 52 | 53 | } 54 | -------------------------------------------------------------------------------- /auto/src/test/java/com/example/auto/AutoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.auto; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.reflect.AutoTestContextLoader; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 10 | import org.springframework.boot.test.web.client.TestRestTemplate; 11 | import org.springframework.test.context.ContextConfiguration; 12 | import org.springframework.test.context.junit4.SpringRunner; 13 | 14 | import static org.assertj.core.api.Assertions.assertThat; 15 | 16 | @RunWith(SpringRunner.class) 17 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 18 | @ContextConfiguration(classes = AutoApplication.class, loader = AutoTestContextLoader.class) 19 | public class AutoApplicationTests { 20 | 21 | @Autowired 22 | private TestRestTemplate rest; 23 | 24 | @Test 25 | public void contextLoads() { 26 | assertThat(rest.getForObject("/", String.class)).isEqualTo("Hello"); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /auto/src/test/java/com/example/demo/DemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.demo; 2 | 3 | import java.io.Closeable; 4 | import java.io.IOException; 5 | 6 | import org.springframework.beans.factory.annotation.Value; 7 | import org.springframework.boot.autoconfigure.SpringBootApplication; 8 | import org.springframework.boot.builder.SpringApplicationBuilder; 9 | import org.springframework.context.ConfigurableApplicationContext; 10 | import org.springframework.web.bind.annotation.GetMapping; 11 | import org.springframework.web.bind.annotation.RestController; 12 | 13 | @SpringBootApplication 14 | // @Import(LazyInitBeanFactoryPostProcessor.class) 15 | @RestController 16 | public class DemoApplication implements Runnable, Closeable { 17 | 18 | private ConfigurableApplicationContext context; 19 | 20 | @Value("${greeting:Hello}") 21 | private String greeting; 22 | 23 | @GetMapping 24 | public String home() { 25 | return greeting; 26 | } 27 | 28 | public static void main(String[] args) throws Exception { 29 | DemoApplication last = new DemoApplication(); 30 | last.run(); 31 | if (Boolean.getBoolean("demo.close")) { 32 | last.close(); 33 | } 34 | } 35 | 36 | @Override 37 | public void close() throws IOException { 38 | if (context != null) { 39 | context.close(); 40 | } 41 | } 42 | 43 | @Override 44 | public void run() { 45 | context = new SpringApplicationBuilder(DemoApplication.class) 46 | .properties("--server.port=0", "--spring.jmx.enabled=false").run(); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /auto/src/test/java/com/example/demo/FuncsApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.demo; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 9 | import org.springframework.boot.test.web.client.TestRestTemplate; 10 | import org.springframework.test.context.junit4.SpringRunner; 11 | 12 | import static org.assertj.core.api.Assertions.assertThat; 13 | 14 | @RunWith(SpringRunner.class) 15 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 16 | public class FuncsApplicationTests { 17 | 18 | @Autowired 19 | private TestRestTemplate rest; 20 | 21 | @Test 22 | public void contextLoads() { 23 | assertThat(rest.getForObject("/", String.class)).isEqualTo("Hello"); 24 | } 25 | 26 | } 27 | -------------------------------------------------------------------------------- /mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 40 | 41 | @REM set %HOME% to equivalent of $HOME 42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 43 | 44 | @REM Execute a user defined script before this one 45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 49 | :skipRcPre 50 | 51 | @setlocal 52 | 53 | set ERROR_CODE=0 54 | 55 | @REM To isolate internal variables from possible post scripts, we use another setlocal 56 | @setlocal 57 | 58 | @REM ==== START VALIDATION ==== 59 | if not "%JAVA_HOME%" == "" goto OkJHome 60 | 61 | echo. 62 | echo Error: JAVA_HOME not found in your environment. >&2 63 | echo Please set the JAVA_HOME variable in your environment to match the >&2 64 | echo location of your Java installation. >&2 65 | echo. 66 | goto error 67 | 68 | :OkJHome 69 | if exist "%JAVA_HOME%\bin\java.exe" goto init 70 | 71 | echo. 72 | echo Error: JAVA_HOME is set to an invalid directory. >&2 73 | echo JAVA_HOME = "%JAVA_HOME%" >&2 74 | echo Please set the JAVA_HOME variable in your environment to match the >&2 75 | echo location of your Java installation. >&2 76 | echo. 77 | goto error 78 | 79 | @REM ==== END VALIDATION ==== 80 | 81 | :init 82 | 83 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 84 | @REM Fallback to current working directory if not found. 85 | 86 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 87 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 88 | 89 | set EXEC_DIR=%CD% 90 | set WDIR=%EXEC_DIR% 91 | :findBaseDir 92 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 93 | cd .. 94 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 95 | set WDIR=%CD% 96 | goto findBaseDir 97 | 98 | :baseDirFound 99 | set MAVEN_PROJECTBASEDIR=%WDIR% 100 | cd "%EXEC_DIR%" 101 | goto endDetectBaseDir 102 | 103 | :baseDirNotFound 104 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 105 | cd "%EXEC_DIR%" 106 | 107 | :endDetectBaseDir 108 | 109 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 110 | 111 | @setlocal EnableExtensions EnableDelayedExpansion 112 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 113 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 114 | 115 | :endReadAdditionalConfig 116 | 117 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 118 | 119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 121 | 122 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 123 | if ERRORLEVEL 1 goto error 124 | goto end 125 | 126 | :error 127 | set ERROR_CODE=1 128 | 129 | :end 130 | @endlocal & set ERROR_CODE=%ERROR_CODE% 131 | 132 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 133 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 134 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 135 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 136 | :skipRcPost 137 | 138 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 139 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 140 | 141 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 142 | 143 | exit /B %ERROR_CODE% 144 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.1.0.BUILD-SNAPSHOT 9 | 10 | 11 | org.springframework.boot.experimental 12 | spring-boot-auto-reflect-parent 13 | 1.0.0.BUILD-SNAPSHOT 14 | pom 15 | Parent Demo 16 | 17 | 18 | auto 19 | samples 20 | 21 | 22 | 23 | 1.8 24 | 25 | 26 | 27 | 28 | 29 | org.apache.maven.plugins 30 | maven-deploy-plugin 31 | 32 | true 33 | false 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | spring-libs-snapshot 42 | http://repo.spring.io/libs-snapshot 43 | 44 | true 45 | 46 | 47 | true 48 | 49 | 50 | 51 | 52 | 53 | 54 | spring-libs-snapshot 55 | http://repo.spring.io/libs-snapshot 56 | 57 | true 58 | 59 | 60 | true 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /samples/cloud/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.example 8 | cloud 9 | 0.0.1-SNAPSHOT 10 | jar 11 | 12 | cloud 13 | Demo project for Spring Boot 14 | 15 | 16 | org.springframework.boot 17 | spring-boot-starter-parent 18 | 2.1.0.BUILD-SNAPSHOT 19 | 20 | 21 | 22 | 23 | UTF-8 24 | UTF-8 25 | Finchley.BUILD-SNAPSHOT 26 | 1.8 27 | 28 | 29 | 30 | 31 | org.springframework.boot.experimental 32 | spring-boot-auto-reflect 33 | 1.0.0.BUILD-SNAPSHOT 34 | 35 | 36 | org.springframework.boot 37 | spring-boot-starter-webflux 38 | 39 | 40 | org.springframework.boot 41 | spring-boot-starter-logging 42 | 43 | 44 | org.springframework.boot 45 | spring-boot-starter-json 46 | 47 | 48 | org.hibernate.validator 49 | hibernate-validator 50 | 51 | 52 | 53 | 54 | org.slf4j 55 | slf4j-jdk14 56 | 57 | 58 | org.springframework.cloud 59 | spring-cloud-starter 60 | 61 | 62 | 63 | org.springframework.boot 64 | spring-boot-starter-test 65 | test 66 | 67 | 68 | 69 | 70 | 71 | 72 | org.springframework.cloud 73 | spring-cloud-dependencies 74 | ${spring-cloud.version} 75 | pom 76 | import 77 | 78 | 79 | 80 | 81 | 82 | 83 | org.springframework.boot 84 | spring-boot-maven-plugin 85 | 86 | 87 | org.apache.maven.plugins 88 | maven-deploy-plugin 89 | 90 | true 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | spring-snapshots 99 | Spring Snapshots 100 | https://repo.spring.io/snapshot 101 | 102 | true 103 | 104 | 105 | 106 | spring-milestones 107 | Spring Milestones 108 | https://repo.spring.io/milestone 109 | 110 | false 111 | 112 | 113 | 114 | 115 | 116 | 117 | spring-snapshots 118 | Spring Snapshots 119 | https://repo.spring.io/snapshot 120 | 121 | true 122 | 123 | 124 | 125 | spring-milestones 126 | Spring Milestones 127 | https://repo.spring.io/milestone 128 | 129 | false 130 | 131 | 132 | 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /samples/cloud/src/main/java/com/example/auto/AutoApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.auto; 17 | 18 | import org.springframework.boot.reflect.SpringApplication; 19 | import org.springframework.context.ApplicationContextInitializer; 20 | import org.springframework.context.support.GenericApplicationContext; 21 | import org.springframework.web.bind.annotation.GetMapping; 22 | import org.springframework.web.bind.annotation.RestController; 23 | 24 | /** 25 | * @author Dave Syer 26 | * 27 | */ 28 | @RestController 29 | public class AutoApplication 30 | implements ApplicationContextInitializer { 31 | 32 | public static final String MARKER = "Benchmark app started"; 33 | 34 | @GetMapping 35 | public String home() { 36 | return "Hello"; 37 | } 38 | 39 | public static void main(String[] args) throws Exception { 40 | SpringApplication.run(AutoApplication.class, args); 41 | System.err.println(MARKER); 42 | } 43 | 44 | @Override 45 | public void initialize(GenericApplicationContext context) { 46 | context.registerBean(AutoApplication.class, () -> this); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /samples/cloud/src/main/java/com/example/demo/DemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.demo; 2 | 3 | import java.io.Closeable; 4 | import java.io.IOException; 5 | 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | import org.springframework.boot.builder.SpringApplicationBuilder; 8 | import org.springframework.context.ConfigurableApplicationContext; 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | @SpringBootApplication 13 | // @Import(LazyInitBeanFactoryPostProcessor.class) 14 | @RestController 15 | public class DemoApplication implements Runnable, Closeable { 16 | 17 | private ConfigurableApplicationContext context; 18 | 19 | @GetMapping 20 | public String home() { 21 | return "Hello"; 22 | } 23 | 24 | public static void main(String[] args) throws Exception { 25 | DemoApplication last = new DemoApplication(); 26 | last.run(); 27 | if (Boolean.getBoolean("demo.close")) { 28 | last.close(); 29 | } 30 | } 31 | 32 | @Override 33 | public void close() throws IOException { 34 | if (context != null) { 35 | context.close(); 36 | } 37 | } 38 | 39 | @Override 40 | public void run() { 41 | context = new SpringApplicationBuilder(DemoApplication.class) 42 | .properties("--server.port=0", "--spring.jmx.enabled=false").run(); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /samples/cloud/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | database=hsqldb 2 | spring.datasource.schema=classpath*:db/${database}/schema.sql 3 | spring.datasource.data=classpath*:db/${database}/data.sql 4 | spring.jpa.hibernate.ddl-auto=none 5 | -------------------------------------------------------------------------------- /samples/cloud/src/main/resources/db/hsqldb/data.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO vets VALUES (1, 'James', 'Carter'); 2 | INSERT INTO vets VALUES (2, 'Helen', 'Leary'); 3 | INSERT INTO vets VALUES (3, 'Linda', 'Douglas'); 4 | INSERT INTO vets VALUES (4, 'Rafael', 'Ortega'); 5 | INSERT INTO vets VALUES (5, 'Henry', 'Stevens'); 6 | INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins'); 7 | 8 | INSERT INTO specialties VALUES (1, 'radiology'); 9 | INSERT INTO specialties VALUES (2, 'surgery'); 10 | INSERT INTO specialties VALUES (3, 'dentistry'); 11 | 12 | INSERT INTO vet_specialties VALUES (2, 1); 13 | INSERT INTO vet_specialties VALUES (3, 2); 14 | INSERT INTO vet_specialties VALUES (3, 3); 15 | INSERT INTO vet_specialties VALUES (4, 2); 16 | INSERT INTO vet_specialties VALUES (5, 1); 17 | 18 | INSERT INTO types VALUES (1, 'cat'); 19 | INSERT INTO types VALUES (2, 'dog'); 20 | INSERT INTO types VALUES (3, 'lizard'); 21 | INSERT INTO types VALUES (4, 'snake'); 22 | INSERT INTO types VALUES (5, 'bird'); 23 | INSERT INTO types VALUES (6, 'hamster'); 24 | 25 | INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023'); 26 | INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749'); 27 | INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763'); 28 | INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198'); 29 | INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765'); 30 | INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654'); 31 | INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387'); 32 | INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683'); 33 | INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); 34 | INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); 35 | 36 | INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1); 37 | INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2); 38 | INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3); 39 | INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3); 40 | INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4); 41 | INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5); 42 | INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6); 43 | INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6); 44 | INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7); 45 | INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8); 46 | INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9); 47 | INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10); 48 | INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10); 49 | 50 | INSERT INTO visits VALUES (1, 7, '2013-01-01', 'rabies shot'); 51 | INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot'); 52 | INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered'); 53 | INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed'); 54 | -------------------------------------------------------------------------------- /samples/cloud/src/main/resources/db/hsqldb/schema.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE vet_specialties IF EXISTS; 2 | DROP TABLE vets IF EXISTS; 3 | DROP TABLE specialties IF EXISTS; 4 | DROP TABLE visits IF EXISTS; 5 | DROP TABLE pets IF EXISTS; 6 | DROP TABLE types IF EXISTS; 7 | DROP TABLE owners IF EXISTS; 8 | 9 | 10 | CREATE TABLE vets ( 11 | id INTEGER IDENTITY PRIMARY KEY, 12 | first_name VARCHAR(30), 13 | last_name VARCHAR(30) 14 | ); 15 | CREATE INDEX vets_last_name ON vets (last_name); 16 | 17 | CREATE TABLE specialties ( 18 | id INTEGER IDENTITY PRIMARY KEY, 19 | name VARCHAR(80) 20 | ); 21 | CREATE INDEX specialties_name ON specialties (name); 22 | 23 | CREATE TABLE vet_specialties ( 24 | vet_id INTEGER NOT NULL, 25 | specialty_id INTEGER NOT NULL 26 | ); 27 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id); 28 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id); 29 | 30 | CREATE TABLE types ( 31 | id INTEGER IDENTITY PRIMARY KEY, 32 | name VARCHAR(80) 33 | ); 34 | CREATE INDEX types_name ON types (name); 35 | 36 | CREATE TABLE owners ( 37 | id INTEGER IDENTITY PRIMARY KEY, 38 | first_name VARCHAR(30), 39 | last_name VARCHAR_IGNORECASE(30), 40 | address VARCHAR(255), 41 | city VARCHAR(80), 42 | telephone VARCHAR(20) 43 | ); 44 | CREATE INDEX owners_last_name ON owners (last_name); 45 | 46 | CREATE TABLE pets ( 47 | id INTEGER IDENTITY PRIMARY KEY, 48 | name VARCHAR(30), 49 | birth_date DATE, 50 | type_id INTEGER NOT NULL, 51 | owner_id INTEGER NOT NULL 52 | ); 53 | ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id); 54 | ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id); 55 | CREATE INDEX pets_name ON pets (name); 56 | 57 | CREATE TABLE visits ( 58 | id INTEGER IDENTITY PRIMARY KEY, 59 | pet_id INTEGER NOT NULL, 60 | visit_date DATE, 61 | description VARCHAR(255) 62 | ); 63 | ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id); 64 | CREATE INDEX visits_pet_id ON visits (pet_id); 65 | -------------------------------------------------------------------------------- /samples/cloud/src/test/java/com/example/auto/AutoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.auto; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.reflect.AutoTestContextLoader; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 10 | import org.springframework.test.context.ContextConfiguration; 11 | import org.springframework.test.context.junit4.SpringRunner; 12 | import org.springframework.test.web.reactive.server.WebTestClient; 13 | 14 | @RunWith(SpringRunner.class) 15 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 16 | @ContextConfiguration(classes = AutoApplication.class, loader = AutoTestContextLoader.class) 17 | public class AutoApplicationTests { 18 | 19 | @Autowired 20 | private WebTestClient rest; 21 | 22 | @Test 23 | public void contextLoads() { 24 | rest.get().uri("/").exchange().expectBody(String.class).isEqualTo("Hello"); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /samples/cloud/src/test/java/com/example/auto/MockApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.auto; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | 6 | import org.springframework.boot.reflect.AutoTestContextLoader; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.test.context.ContextConfiguration; 9 | import org.springframework.test.context.junit4.SpringRunner; 10 | 11 | @RunWith(SpringRunner.class) 12 | @SpringBootTest 13 | @ContextConfiguration(classes = AutoApplication.class, loader = AutoTestContextLoader.class) 14 | // @AutoConfigureWebTestClient 15 | public class MockApplicationTests { 16 | 17 | // @Autowired 18 | // private WebTestClient rest; 19 | // 20 | @Test 21 | public void contextLoads() { 22 | // assertThat(rest.getForObject("/", String.class)).isEqualTo("Hello"); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /samples/demo/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.example 8 | demo 9 | 0.0.1-SNAPSHOT 10 | jar 11 | 12 | demo 13 | Demo project for Spring Boot 14 | 15 | 16 | org.springframework.boot 17 | spring-boot-starter-parent 18 | 2.1.0.BUILD-SNAPSHOT 19 | 20 | 21 | 22 | 23 | UTF-8 24 | UTF-8 25 | 1.8 26 | 27 | 28 | 29 | 30 | org.springframework.boot.experimental 31 | spring-boot-auto-reflect 32 | 1.0.0.BUILD-SNAPSHOT 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-webflux 37 | 38 | 39 | org.springframework.boot 40 | spring-boot-starter-logging 41 | 42 | 43 | org.springframework.boot 44 | spring-boot-starter-json 45 | 46 | 47 | org.hibernate.validator 48 | hibernate-validator 49 | 50 | 51 | 52 | 53 | org.slf4j 54 | slf4j-jdk14 55 | 56 | 57 | 58 | org.springframework.boot 59 | spring-boot-starter-test 60 | test 61 | 62 | 63 | 64 | 65 | 66 | 67 | org.springframework.boot 68 | spring-boot-maven-plugin 69 | 70 | 71 | org.apache.maven.plugins 72 | maven-deploy-plugin 73 | 74 | true 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | spring-snapshots 83 | Spring Snapshots 84 | https://repo.spring.io/snapshot 85 | 86 | true 87 | 88 | 89 | 90 | spring-milestones 91 | Spring Milestones 92 | https://repo.spring.io/milestone 93 | 94 | false 95 | 96 | 97 | 98 | 99 | 100 | 101 | spring-snapshots 102 | Spring Snapshots 103 | https://repo.spring.io/snapshot 104 | 105 | true 106 | 107 | 108 | 109 | spring-milestones 110 | Spring Milestones 111 | https://repo.spring.io/milestone 112 | 113 | false 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /samples/demo/src/main/java/com/example/auto/AutoApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.auto; 17 | 18 | import org.springframework.boot.reflect.SpringApplication; 19 | import org.springframework.context.ApplicationContextInitializer; 20 | import org.springframework.context.support.GenericApplicationContext; 21 | import org.springframework.web.bind.annotation.GetMapping; 22 | import org.springframework.web.bind.annotation.RestController; 23 | 24 | /** 25 | * @author Dave Syer 26 | * 27 | */ 28 | @RestController 29 | public class AutoApplication 30 | implements ApplicationContextInitializer { 31 | 32 | public static final String MARKER = "Benchmark app started"; 33 | 34 | @GetMapping 35 | public String home() { 36 | return "Hello"; 37 | } 38 | 39 | public static void main(String[] args) throws Exception { 40 | SpringApplication.run(AutoApplication.class, args); 41 | System.err.println(MARKER); 42 | } 43 | 44 | @Override 45 | public void initialize(GenericApplicationContext context) { 46 | context.registerBean(AutoApplication.class, () -> this); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /samples/demo/src/main/java/com/example/demo/DemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.demo; 2 | 3 | import org.springframework.boot.autoconfigure.SpringBootApplication; 4 | import org.springframework.boot.reflect.SpringApplication; 5 | import org.springframework.web.bind.annotation.GetMapping; 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | @SpringBootApplication 9 | // @Import(LazyInitBeanFactoryPostProcessor.class) 10 | @RestController 11 | public class DemoApplication { 12 | 13 | @GetMapping 14 | public String home() { 15 | return "Hello"; 16 | } 17 | 18 | public static void main(String[] args) throws Exception { 19 | SpringApplication.run(DemoApplication.class, args); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /samples/demo/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | database=hsqldb 2 | spring.datasource.schema=classpath*:db/${database}/schema.sql 3 | spring.datasource.data=classpath*:db/${database}/data.sql 4 | spring.jpa.hibernate.ddl-auto=none 5 | -------------------------------------------------------------------------------- /samples/demo/src/main/resources/db/hsqldb/data.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO vets VALUES (1, 'James', 'Carter'); 2 | INSERT INTO vets VALUES (2, 'Helen', 'Leary'); 3 | INSERT INTO vets VALUES (3, 'Linda', 'Douglas'); 4 | INSERT INTO vets VALUES (4, 'Rafael', 'Ortega'); 5 | INSERT INTO vets VALUES (5, 'Henry', 'Stevens'); 6 | INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins'); 7 | 8 | INSERT INTO specialties VALUES (1, 'radiology'); 9 | INSERT INTO specialties VALUES (2, 'surgery'); 10 | INSERT INTO specialties VALUES (3, 'dentistry'); 11 | 12 | INSERT INTO vet_specialties VALUES (2, 1); 13 | INSERT INTO vet_specialties VALUES (3, 2); 14 | INSERT INTO vet_specialties VALUES (3, 3); 15 | INSERT INTO vet_specialties VALUES (4, 2); 16 | INSERT INTO vet_specialties VALUES (5, 1); 17 | 18 | INSERT INTO types VALUES (1, 'cat'); 19 | INSERT INTO types VALUES (2, 'dog'); 20 | INSERT INTO types VALUES (3, 'lizard'); 21 | INSERT INTO types VALUES (4, 'snake'); 22 | INSERT INTO types VALUES (5, 'bird'); 23 | INSERT INTO types VALUES (6, 'hamster'); 24 | 25 | INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023'); 26 | INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749'); 27 | INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763'); 28 | INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198'); 29 | INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765'); 30 | INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654'); 31 | INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387'); 32 | INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683'); 33 | INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); 34 | INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); 35 | 36 | INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1); 37 | INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2); 38 | INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3); 39 | INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3); 40 | INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4); 41 | INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5); 42 | INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6); 43 | INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6); 44 | INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7); 45 | INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8); 46 | INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9); 47 | INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10); 48 | INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10); 49 | 50 | INSERT INTO visits VALUES (1, 7, '2013-01-01', 'rabies shot'); 51 | INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot'); 52 | INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered'); 53 | INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed'); 54 | -------------------------------------------------------------------------------- /samples/demo/src/main/resources/db/hsqldb/schema.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE vet_specialties IF EXISTS; 2 | DROP TABLE vets IF EXISTS; 3 | DROP TABLE specialties IF EXISTS; 4 | DROP TABLE visits IF EXISTS; 5 | DROP TABLE pets IF EXISTS; 6 | DROP TABLE types IF EXISTS; 7 | DROP TABLE owners IF EXISTS; 8 | 9 | 10 | CREATE TABLE vets ( 11 | id INTEGER IDENTITY PRIMARY KEY, 12 | first_name VARCHAR(30), 13 | last_name VARCHAR(30) 14 | ); 15 | CREATE INDEX vets_last_name ON vets (last_name); 16 | 17 | CREATE TABLE specialties ( 18 | id INTEGER IDENTITY PRIMARY KEY, 19 | name VARCHAR(80) 20 | ); 21 | CREATE INDEX specialties_name ON specialties (name); 22 | 23 | CREATE TABLE vet_specialties ( 24 | vet_id INTEGER NOT NULL, 25 | specialty_id INTEGER NOT NULL 26 | ); 27 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id); 28 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id); 29 | 30 | CREATE TABLE types ( 31 | id INTEGER IDENTITY PRIMARY KEY, 32 | name VARCHAR(80) 33 | ); 34 | CREATE INDEX types_name ON types (name); 35 | 36 | CREATE TABLE owners ( 37 | id INTEGER IDENTITY PRIMARY KEY, 38 | first_name VARCHAR(30), 39 | last_name VARCHAR_IGNORECASE(30), 40 | address VARCHAR(255), 41 | city VARCHAR(80), 42 | telephone VARCHAR(20) 43 | ); 44 | CREATE INDEX owners_last_name ON owners (last_name); 45 | 46 | CREATE TABLE pets ( 47 | id INTEGER IDENTITY PRIMARY KEY, 48 | name VARCHAR(30), 49 | birth_date DATE, 50 | type_id INTEGER NOT NULL, 51 | owner_id INTEGER NOT NULL 52 | ); 53 | ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id); 54 | ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id); 55 | CREATE INDEX pets_name ON pets (name); 56 | 57 | CREATE TABLE visits ( 58 | id INTEGER IDENTITY PRIMARY KEY, 59 | pet_id INTEGER NOT NULL, 60 | visit_date DATE, 61 | description VARCHAR(255) 62 | ); 63 | ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id); 64 | CREATE INDEX visits_pet_id ON visits (pet_id); 65 | -------------------------------------------------------------------------------- /samples/demo/src/test/java/com/example/auto/AutoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.auto; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.reflect.AutoTestContextLoader; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 10 | import org.springframework.test.context.ContextConfiguration; 11 | import org.springframework.test.context.junit4.SpringRunner; 12 | import org.springframework.test.web.reactive.server.WebTestClient; 13 | 14 | @RunWith(SpringRunner.class) 15 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 16 | @ContextConfiguration(classes = AutoApplication.class, loader = AutoTestContextLoader.class) 17 | public class AutoApplicationTests { 18 | 19 | @Autowired 20 | private WebTestClient rest; 21 | 22 | @Test 23 | public void contextLoads() { 24 | rest.get().uri("/").exchange().expectBody(String.class).isEqualTo("Hello"); 25 | } 26 | 27 | } 28 | -------------------------------------------------------------------------------- /samples/demo/src/test/java/com/example/auto/MockApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.auto; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | 6 | import org.springframework.boot.reflect.AutoTestContextLoader; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.test.context.ContextConfiguration; 9 | import org.springframework.test.context.junit4.SpringRunner; 10 | 11 | @RunWith(SpringRunner.class) 12 | @SpringBootTest 13 | @ContextConfiguration(classes = AutoApplication.class, loader = AutoTestContextLoader.class) 14 | // @AutoConfigureWebTestClient 15 | public class MockApplicationTests { 16 | 17 | // @Autowired 18 | // private WebTestClient rest; 19 | // 20 | @Test 21 | public void contextLoads() { 22 | // assertThat(rest.getForObject("/", String.class)).isEqualTo("Hello"); 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /samples/empty/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.example 8 | empty 9 | 0.0.1-SNAPSHOT 10 | jar 11 | 12 | empty 13 | Demo project for Spring Boot 14 | 15 | 16 | org.springframework.boot 17 | spring-boot-starter-parent 18 | 2.1.0.BUILD-SNAPSHOT 19 | 20 | 21 | 22 | 23 | UTF-8 24 | UTF-8 25 | 1.8 26 | 27 | 28 | 29 | 30 | org.springframework.boot.experimental 31 | spring-boot-auto-reflect 32 | 1.0.0.BUILD-SNAPSHOT 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter 37 | 38 | 39 | org.springframework.boot 40 | spring-boot-starter-logging 41 | 42 | 43 | 44 | 45 | org.slf4j 46 | slf4j-jdk14 47 | 48 | 49 | 50 | org.springframework.boot 51 | spring-boot-starter-test 52 | test 53 | 54 | 55 | 56 | 57 | 58 | 59 | org.springframework.boot 60 | spring-boot-maven-plugin 61 | 62 | 63 | org.apache.maven.plugins 64 | maven-deploy-plugin 65 | 66 | true 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | spring-snapshots 75 | Spring Snapshots 76 | https://repo.spring.io/snapshot 77 | 78 | true 79 | 80 | 81 | 82 | spring-milestones 83 | Spring Milestones 84 | https://repo.spring.io/milestone 85 | 86 | false 87 | 88 | 89 | 90 | 91 | 92 | 93 | spring-snapshots 94 | Spring Snapshots 95 | https://repo.spring.io/snapshot 96 | 97 | true 98 | 99 | 100 | 101 | spring-milestones 102 | Spring Milestones 103 | https://repo.spring.io/milestone 104 | 105 | false 106 | 107 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /samples/empty/src/main/java/com/example/auto/AutoApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.auto; 17 | 18 | import org.springframework.boot.reflect.SpringApplication; 19 | import org.springframework.context.ApplicationContextInitializer; 20 | import org.springframework.context.support.GenericApplicationContext; 21 | 22 | /** 23 | * @author Dave Syer 24 | * 25 | */ 26 | public class AutoApplication 27 | implements ApplicationContextInitializer { 28 | 29 | public static final String MARKER = "Benchmark app started"; 30 | 31 | public static void main(String[] args) throws Exception { 32 | SpringApplication.run(AutoApplication.class, args); 33 | System.err.println(MARKER); 34 | } 35 | 36 | @Override 37 | public void initialize(GenericApplicationContext context) { 38 | context.registerBean(AutoApplication.class, () -> this); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /samples/empty/src/main/java/com/example/demo/DemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.demo; 2 | 3 | import org.springframework.boot.autoconfigure.SpringBootApplication; 4 | import org.springframework.boot.builder.SpringApplicationBuilder; 5 | 6 | @SpringBootApplication 7 | // @Import(LazyInitBeanFactoryPostProcessor.class) 8 | public class DemoApplication { 9 | 10 | public static void main(String[] args) throws Exception { 11 | new SpringApplicationBuilder(DemoApplication.class) 12 | .properties("--server.port=0", "--spring.jmx.enabled=false").run(); 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /samples/empty/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | database=hsqldb 2 | spring.datasource.schema=classpath*:db/${database}/schema.sql 3 | spring.datasource.data=classpath*:db/${database}/data.sql 4 | spring.jpa.hibernate.ddl-auto=none 5 | -------------------------------------------------------------------------------- /samples/empty/src/main/resources/db/hsqldb/data.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO vets VALUES (1, 'James', 'Carter'); 2 | INSERT INTO vets VALUES (2, 'Helen', 'Leary'); 3 | INSERT INTO vets VALUES (3, 'Linda', 'Douglas'); 4 | INSERT INTO vets VALUES (4, 'Rafael', 'Ortega'); 5 | INSERT INTO vets VALUES (5, 'Henry', 'Stevens'); 6 | INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins'); 7 | 8 | INSERT INTO specialties VALUES (1, 'radiology'); 9 | INSERT INTO specialties VALUES (2, 'surgery'); 10 | INSERT INTO specialties VALUES (3, 'dentistry'); 11 | 12 | INSERT INTO vet_specialties VALUES (2, 1); 13 | INSERT INTO vet_specialties VALUES (3, 2); 14 | INSERT INTO vet_specialties VALUES (3, 3); 15 | INSERT INTO vet_specialties VALUES (4, 2); 16 | INSERT INTO vet_specialties VALUES (5, 1); 17 | 18 | INSERT INTO types VALUES (1, 'cat'); 19 | INSERT INTO types VALUES (2, 'dog'); 20 | INSERT INTO types VALUES (3, 'lizard'); 21 | INSERT INTO types VALUES (4, 'snake'); 22 | INSERT INTO types VALUES (5, 'bird'); 23 | INSERT INTO types VALUES (6, 'hamster'); 24 | 25 | INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023'); 26 | INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749'); 27 | INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763'); 28 | INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198'); 29 | INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765'); 30 | INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654'); 31 | INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387'); 32 | INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683'); 33 | INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); 34 | INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); 35 | 36 | INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1); 37 | INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2); 38 | INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3); 39 | INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3); 40 | INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4); 41 | INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5); 42 | INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6); 43 | INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6); 44 | INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7); 45 | INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8); 46 | INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9); 47 | INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10); 48 | INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10); 49 | 50 | INSERT INTO visits VALUES (1, 7, '2013-01-01', 'rabies shot'); 51 | INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot'); 52 | INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered'); 53 | INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed'); 54 | -------------------------------------------------------------------------------- /samples/empty/src/main/resources/db/hsqldb/schema.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE vet_specialties IF EXISTS; 2 | DROP TABLE vets IF EXISTS; 3 | DROP TABLE specialties IF EXISTS; 4 | DROP TABLE visits IF EXISTS; 5 | DROP TABLE pets IF EXISTS; 6 | DROP TABLE types IF EXISTS; 7 | DROP TABLE owners IF EXISTS; 8 | 9 | 10 | CREATE TABLE vets ( 11 | id INTEGER IDENTITY PRIMARY KEY, 12 | first_name VARCHAR(30), 13 | last_name VARCHAR(30) 14 | ); 15 | CREATE INDEX vets_last_name ON vets (last_name); 16 | 17 | CREATE TABLE specialties ( 18 | id INTEGER IDENTITY PRIMARY KEY, 19 | name VARCHAR(80) 20 | ); 21 | CREATE INDEX specialties_name ON specialties (name); 22 | 23 | CREATE TABLE vet_specialties ( 24 | vet_id INTEGER NOT NULL, 25 | specialty_id INTEGER NOT NULL 26 | ); 27 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id); 28 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id); 29 | 30 | CREATE TABLE types ( 31 | id INTEGER IDENTITY PRIMARY KEY, 32 | name VARCHAR(80) 33 | ); 34 | CREATE INDEX types_name ON types (name); 35 | 36 | CREATE TABLE owners ( 37 | id INTEGER IDENTITY PRIMARY KEY, 38 | first_name VARCHAR(30), 39 | last_name VARCHAR_IGNORECASE(30), 40 | address VARCHAR(255), 41 | city VARCHAR(80), 42 | telephone VARCHAR(20) 43 | ); 44 | CREATE INDEX owners_last_name ON owners (last_name); 45 | 46 | CREATE TABLE pets ( 47 | id INTEGER IDENTITY PRIMARY KEY, 48 | name VARCHAR(30), 49 | birth_date DATE, 50 | type_id INTEGER NOT NULL, 51 | owner_id INTEGER NOT NULL 52 | ); 53 | ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id); 54 | ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id); 55 | CREATE INDEX pets_name ON pets (name); 56 | 57 | CREATE TABLE visits ( 58 | id INTEGER IDENTITY PRIMARY KEY, 59 | pet_id INTEGER NOT NULL, 60 | visit_date DATE, 61 | description VARCHAR(255) 62 | ); 63 | ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id); 64 | CREATE INDEX visits_pet_id ON visits (pet_id); 65 | -------------------------------------------------------------------------------- /samples/empty/src/test/java/com/example/auto/AutoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.auto; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | 6 | import org.springframework.boot.reflect.AutoTestContextLoader; 7 | import org.springframework.boot.test.context.SpringBootTest; 8 | import org.springframework.test.context.ContextConfiguration; 9 | import org.springframework.test.context.junit4.SpringRunner; 10 | 11 | @RunWith(SpringRunner.class) 12 | @SpringBootTest 13 | @ContextConfiguration(classes = AutoApplication.class, loader = AutoTestContextLoader.class) 14 | public class AutoApplicationTests { 15 | 16 | @Test 17 | public void contextLoads() { 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /samples/mvc/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | com.example 8 | mvc 9 | 0.0.1-SNAPSHOT 10 | jar 11 | 12 | mvc 13 | Demo project for Spring Boot 14 | 15 | 16 | org.springframework.boot 17 | spring-boot-starter-parent 18 | 2.1.0.BUILD-SNAPSHOT 19 | 20 | 21 | 22 | 23 | UTF-8 24 | UTF-8 25 | 1.8 26 | 27 | 28 | 29 | 30 | org.springframework.boot.experimental 31 | spring-boot-auto-reflect 32 | 1.0.0.BUILD-SNAPSHOT 33 | 34 | 35 | org.springframework.boot 36 | spring-boot-starter-web 37 | 38 | 39 | org.springframework.boot 40 | spring-boot-starter-logging 41 | 42 | 43 | org.springframework.boot 44 | spring-boot-starter-json 45 | 46 | 47 | org.hibernate.validator 48 | hibernate-validator 49 | 50 | 51 | 52 | 53 | org.slf4j 54 | slf4j-jdk14 55 | 56 | 57 | 58 | org.springframework.boot 59 | spring-boot-starter-test 60 | test 61 | 62 | 63 | 64 | 65 | 66 | 67 | org.springframework.boot 68 | spring-boot-maven-plugin 69 | 70 | 71 | org.apache.maven.plugins 72 | maven-deploy-plugin 73 | 74 | true 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | spring-snapshots 83 | Spring Snapshots 84 | https://repo.spring.io/snapshot 85 | 86 | true 87 | 88 | 89 | 90 | spring-milestones 91 | Spring Milestones 92 | https://repo.spring.io/milestone 93 | 94 | false 95 | 96 | 97 | 98 | 99 | 100 | 101 | spring-snapshots 102 | Spring Snapshots 103 | https://repo.spring.io/snapshot 104 | 105 | true 106 | 107 | 108 | 109 | spring-milestones 110 | Spring Milestones 111 | https://repo.spring.io/milestone 112 | 113 | false 114 | 115 | 116 | 117 | 118 | 119 | 120 | -------------------------------------------------------------------------------- /samples/mvc/src/main/java/com/example/auto/AutoApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package com.example.auto; 17 | 18 | import org.springframework.boot.reflect.SpringApplication; 19 | import org.springframework.context.ApplicationContextInitializer; 20 | import org.springframework.context.support.GenericApplicationContext; 21 | import org.springframework.web.bind.annotation.GetMapping; 22 | import org.springframework.web.bind.annotation.RestController; 23 | 24 | /** 25 | * @author Dave Syer 26 | * 27 | */ 28 | @RestController 29 | public class AutoApplication 30 | implements ApplicationContextInitializer { 31 | 32 | public static final String MARKER = "Benchmark app started"; 33 | 34 | @GetMapping 35 | public String home() { 36 | return "Hello"; 37 | } 38 | 39 | public static void main(String[] args) throws Exception { 40 | SpringApplication.run(AutoApplication.class, args); 41 | System.err.println(MARKER); 42 | } 43 | 44 | @Override 45 | public void initialize(GenericApplicationContext context) { 46 | context.registerBean(AutoApplication.class, () -> this); 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /samples/mvc/src/main/java/com/example/demo/DemoApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.demo; 2 | 3 | import java.io.Closeable; 4 | import java.io.IOException; 5 | 6 | import org.springframework.boot.autoconfigure.SpringBootApplication; 7 | import org.springframework.boot.builder.SpringApplicationBuilder; 8 | import org.springframework.context.ConfigurableApplicationContext; 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.RestController; 11 | 12 | @SpringBootApplication 13 | // @Import(LazyInitBeanFactoryPostProcessor.class) 14 | @RestController 15 | public class DemoApplication implements Runnable, Closeable { 16 | 17 | private ConfigurableApplicationContext context; 18 | 19 | @GetMapping 20 | public String home() { 21 | return "Hello"; 22 | } 23 | 24 | public static void main(String[] args) throws Exception { 25 | DemoApplication last = new DemoApplication(); 26 | last.run(); 27 | if (Boolean.getBoolean("demo.close")) { 28 | last.close(); 29 | } 30 | } 31 | 32 | @Override 33 | public void close() throws IOException { 34 | if (context != null) { 35 | context.close(); 36 | } 37 | } 38 | 39 | @Override 40 | public void run() { 41 | context = new SpringApplicationBuilder(DemoApplication.class) 42 | .properties("--server.port=0", "--spring.jmx.enabled=false").run(); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /samples/mvc/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | database=hsqldb 2 | spring.datasource.schema=classpath*:db/${database}/schema.sql 3 | spring.datasource.data=classpath*:db/${database}/data.sql 4 | spring.jpa.hibernate.ddl-auto=none 5 | -------------------------------------------------------------------------------- /samples/mvc/src/main/resources/db/hsqldb/data.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO vets VALUES (1, 'James', 'Carter'); 2 | INSERT INTO vets VALUES (2, 'Helen', 'Leary'); 3 | INSERT INTO vets VALUES (3, 'Linda', 'Douglas'); 4 | INSERT INTO vets VALUES (4, 'Rafael', 'Ortega'); 5 | INSERT INTO vets VALUES (5, 'Henry', 'Stevens'); 6 | INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins'); 7 | 8 | INSERT INTO specialties VALUES (1, 'radiology'); 9 | INSERT INTO specialties VALUES (2, 'surgery'); 10 | INSERT INTO specialties VALUES (3, 'dentistry'); 11 | 12 | INSERT INTO vet_specialties VALUES (2, 1); 13 | INSERT INTO vet_specialties VALUES (3, 2); 14 | INSERT INTO vet_specialties VALUES (3, 3); 15 | INSERT INTO vet_specialties VALUES (4, 2); 16 | INSERT INTO vet_specialties VALUES (5, 1); 17 | 18 | INSERT INTO types VALUES (1, 'cat'); 19 | INSERT INTO types VALUES (2, 'dog'); 20 | INSERT INTO types VALUES (3, 'lizard'); 21 | INSERT INTO types VALUES (4, 'snake'); 22 | INSERT INTO types VALUES (5, 'bird'); 23 | INSERT INTO types VALUES (6, 'hamster'); 24 | 25 | INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023'); 26 | INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749'); 27 | INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763'); 28 | INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198'); 29 | INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765'); 30 | INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654'); 31 | INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387'); 32 | INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683'); 33 | INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); 34 | INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); 35 | 36 | INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1); 37 | INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2); 38 | INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3); 39 | INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3); 40 | INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4); 41 | INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5); 42 | INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6); 43 | INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6); 44 | INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7); 45 | INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8); 46 | INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9); 47 | INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10); 48 | INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10); 49 | 50 | INSERT INTO visits VALUES (1, 7, '2013-01-01', 'rabies shot'); 51 | INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot'); 52 | INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered'); 53 | INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed'); 54 | -------------------------------------------------------------------------------- /samples/mvc/src/main/resources/db/hsqldb/schema.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE vet_specialties IF EXISTS; 2 | DROP TABLE vets IF EXISTS; 3 | DROP TABLE specialties IF EXISTS; 4 | DROP TABLE visits IF EXISTS; 5 | DROP TABLE pets IF EXISTS; 6 | DROP TABLE types IF EXISTS; 7 | DROP TABLE owners IF EXISTS; 8 | 9 | 10 | CREATE TABLE vets ( 11 | id INTEGER IDENTITY PRIMARY KEY, 12 | first_name VARCHAR(30), 13 | last_name VARCHAR(30) 14 | ); 15 | CREATE INDEX vets_last_name ON vets (last_name); 16 | 17 | CREATE TABLE specialties ( 18 | id INTEGER IDENTITY PRIMARY KEY, 19 | name VARCHAR(80) 20 | ); 21 | CREATE INDEX specialties_name ON specialties (name); 22 | 23 | CREATE TABLE vet_specialties ( 24 | vet_id INTEGER NOT NULL, 25 | specialty_id INTEGER NOT NULL 26 | ); 27 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id); 28 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id); 29 | 30 | CREATE TABLE types ( 31 | id INTEGER IDENTITY PRIMARY KEY, 32 | name VARCHAR(80) 33 | ); 34 | CREATE INDEX types_name ON types (name); 35 | 36 | CREATE TABLE owners ( 37 | id INTEGER IDENTITY PRIMARY KEY, 38 | first_name VARCHAR(30), 39 | last_name VARCHAR_IGNORECASE(30), 40 | address VARCHAR(255), 41 | city VARCHAR(80), 42 | telephone VARCHAR(20) 43 | ); 44 | CREATE INDEX owners_last_name ON owners (last_name); 45 | 46 | CREATE TABLE pets ( 47 | id INTEGER IDENTITY PRIMARY KEY, 48 | name VARCHAR(30), 49 | birth_date DATE, 50 | type_id INTEGER NOT NULL, 51 | owner_id INTEGER NOT NULL 52 | ); 53 | ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id); 54 | ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id); 55 | CREATE INDEX pets_name ON pets (name); 56 | 57 | CREATE TABLE visits ( 58 | id INTEGER IDENTITY PRIMARY KEY, 59 | pet_id INTEGER NOT NULL, 60 | visit_date DATE, 61 | description VARCHAR(255) 62 | ); 63 | ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id); 64 | CREATE INDEX visits_pet_id ON visits (pet_id); 65 | -------------------------------------------------------------------------------- /samples/mvc/src/test/java/com/example/auto/AutoApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.example.auto; 2 | 3 | import org.junit.Test; 4 | import org.junit.runner.RunWith; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.boot.reflect.AutoTestContextLoader; 8 | import org.springframework.boot.test.context.SpringBootTest; 9 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 10 | import org.springframework.boot.test.web.client.TestRestTemplate; 11 | import org.springframework.test.context.ContextConfiguration; 12 | import org.springframework.test.context.junit4.SpringRunner; 13 | 14 | import static org.assertj.core.api.Assertions.assertThat; 15 | 16 | @RunWith(SpringRunner.class) 17 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 18 | @ContextConfiguration(classes = AutoApplication.class, loader = AutoTestContextLoader.class) 19 | public class AutoApplicationTests { 20 | 21 | @Autowired 22 | private TestRestTemplate rest; 23 | 24 | @Test 25 | public void contextLoads() { 26 | assertThat(rest.getForObject("/", String.class)).isEqualTo("Hello"); 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /samples/petclinic/docker-compose.yml: -------------------------------------------------------------------------------- 1 | mysql: 2 | image: mysql:5.7 3 | ports: 4 | - "3306:3306" 5 | environment: 6 | - MYSQL_ROOT_PASSWORD=petclinic 7 | - MYSQL_DATABASE=petclinic 8 | volumes: 9 | - "./conf.d:/etc/mysql/conf.d:ro" 10 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/PetClinicApplication.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.springframework.samples.petclinic; 18 | 19 | import org.springframework.boot.autoconfigure.SpringBootApplication; 20 | import org.springframework.boot.reflect.SpringApplication; 21 | import org.springframework.context.ApplicationContextInitializer; 22 | import org.springframework.context.support.GenericApplicationContext; 23 | import org.springframework.samples.petclinic.owner.OwnerController; 24 | import org.springframework.samples.petclinic.owner.PetController; 25 | import org.springframework.samples.petclinic.owner.VisitController; 26 | import org.springframework.samples.petclinic.system.CrashController; 27 | import org.springframework.samples.petclinic.system.WelcomeController; 28 | import org.springframework.samples.petclinic.vet.VetController; 29 | 30 | /** 31 | * PetClinic Spring Boot Application. 32 | * 33 | * @author Dave Syer 34 | * 35 | */ 36 | @SpringBootApplication 37 | public class PetClinicApplication 38 | implements ApplicationContextInitializer { 39 | 40 | public static void main(String[] args) { 41 | SpringApplication.run(PetClinicApplication.class, args); 42 | } 43 | 44 | @Override 45 | public void initialize(GenericApplicationContext context) { 46 | context.registerBean(OwnerController.class); 47 | context.registerBean(PetController.class); 48 | context.registerBean(VetController.class); 49 | context.registerBean(VisitController.class); 50 | context.registerBean(WelcomeController.class); 51 | context.registerBean(CrashController.class); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/model/BaseEntity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.model; 17 | 18 | import java.io.Serializable; 19 | 20 | import javax.persistence.GeneratedValue; 21 | import javax.persistence.GenerationType; 22 | import javax.persistence.Id; 23 | import javax.persistence.MappedSuperclass; 24 | 25 | /** 26 | * Simple JavaBean domain object with an id property. Used as a base class for objects 27 | * needing this property. 28 | * 29 | * @author Ken Krebs 30 | * @author Juergen Hoeller 31 | */ 32 | @MappedSuperclass 33 | public class BaseEntity implements Serializable { 34 | @Id 35 | @GeneratedValue(strategy = GenerationType.IDENTITY) 36 | private Integer id; 37 | 38 | public Integer getId() { 39 | return id; 40 | } 41 | 42 | public void setId(Integer id) { 43 | this.id = id; 44 | } 45 | 46 | public boolean isNew() { 47 | return this.id == null; 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/model/NamedEntity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.model; 17 | 18 | import javax.persistence.Column; 19 | import javax.persistence.MappedSuperclass; 20 | 21 | 22 | /** 23 | * Simple JavaBean domain object adds a name property to BaseEntity. Used as a base class for objects 24 | * needing these properties. 25 | * 26 | * @author Ken Krebs 27 | * @author Juergen Hoeller 28 | */ 29 | @MappedSuperclass 30 | public class NamedEntity extends BaseEntity { 31 | 32 | @Column(name = "name") 33 | private String name; 34 | 35 | public String getName() { 36 | return this.name; 37 | } 38 | 39 | public void setName(String name) { 40 | this.name = name; 41 | } 42 | 43 | @Override 44 | public String toString() { 45 | return this.getName(); 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/model/Person.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.model; 17 | 18 | import javax.persistence.Column; 19 | import javax.persistence.MappedSuperclass; 20 | import javax.validation.constraints.NotEmpty; 21 | 22 | /** 23 | * Simple JavaBean domain object representing an person. 24 | * 25 | * @author Ken Krebs 26 | */ 27 | @MappedSuperclass 28 | public class Person extends BaseEntity { 29 | 30 | @Column(name = "first_name") 31 | @NotEmpty 32 | private String firstName; 33 | 34 | @Column(name = "last_name") 35 | @NotEmpty 36 | private String lastName; 37 | 38 | public String getFirstName() { 39 | return this.firstName; 40 | } 41 | 42 | public void setFirstName(String firstName) { 43 | this.firstName = firstName; 44 | } 45 | 46 | public String getLastName() { 47 | return this.lastName; 48 | } 49 | 50 | public void setLastName(String lastName) { 51 | this.lastName = lastName; 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/model/package-info.java: -------------------------------------------------------------------------------- 1 | /** 2 | * The classes in this package represent utilities used by the domain. 3 | */ 4 | package org.springframework.samples.petclinic.model; 5 | 6 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/Owner.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import java.util.ArrayList; 19 | import java.util.Collections; 20 | import java.util.HashSet; 21 | import java.util.List; 22 | import java.util.Set; 23 | 24 | import javax.persistence.CascadeType; 25 | import javax.persistence.Column; 26 | import javax.persistence.Entity; 27 | import javax.persistence.OneToMany; 28 | import javax.persistence.Table; 29 | import javax.validation.constraints.Digits; 30 | import javax.validation.constraints.NotEmpty; 31 | 32 | import org.springframework.beans.support.MutableSortDefinition; 33 | import org.springframework.beans.support.PropertyComparator; 34 | import org.springframework.core.style.ToStringCreator; 35 | import org.springframework.samples.petclinic.model.Person; 36 | 37 | /** 38 | * Simple JavaBean domain object representing an owner. 39 | * 40 | * @author Ken Krebs 41 | * @author Juergen Hoeller 42 | * @author Sam Brannen 43 | * @author Michael Isvy 44 | */ 45 | @Entity 46 | @Table(name = "owners") 47 | public class Owner extends Person { 48 | @Column(name = "address") 49 | @NotEmpty 50 | private String address; 51 | 52 | @Column(name = "city") 53 | @NotEmpty 54 | private String city; 55 | 56 | @Column(name = "telephone") 57 | @NotEmpty 58 | @Digits(fraction = 0, integer = 10) 59 | private String telephone; 60 | 61 | @OneToMany(cascade = CascadeType.ALL, mappedBy = "owner") 62 | private Set pets; 63 | 64 | public String getAddress() { 65 | return this.address; 66 | } 67 | 68 | public void setAddress(String address) { 69 | this.address = address; 70 | } 71 | 72 | public String getCity() { 73 | return this.city; 74 | } 75 | 76 | public void setCity(String city) { 77 | this.city = city; 78 | } 79 | 80 | public String getTelephone() { 81 | return this.telephone; 82 | } 83 | 84 | public void setTelephone(String telephone) { 85 | this.telephone = telephone; 86 | } 87 | 88 | protected Set getPetsInternal() { 89 | if (this.pets == null) { 90 | this.pets = new HashSet<>(); 91 | } 92 | return this.pets; 93 | } 94 | 95 | protected void setPetsInternal(Set pets) { 96 | this.pets = pets; 97 | } 98 | 99 | public List getPets() { 100 | List sortedPets = new ArrayList<>(getPetsInternal()); 101 | PropertyComparator.sort(sortedPets, 102 | new MutableSortDefinition("name", true, true)); 103 | return Collections.unmodifiableList(sortedPets); 104 | } 105 | 106 | public void addPet(Pet pet) { 107 | if (pet.isNew()) { 108 | getPetsInternal().add(pet); 109 | } 110 | pet.setOwner(this); 111 | } 112 | 113 | /** 114 | * Return the Pet with the given name, or null if none found for this Owner. 115 | * 116 | * @param name to test 117 | * @return true if pet name is already in use 118 | */ 119 | public Pet getPet(String name) { 120 | return getPet(name, false); 121 | } 122 | 123 | /** 124 | * Return the Pet with the given name, or null if none found for this Owner. 125 | * 126 | * @param name to test 127 | * @return true if pet name is already in use 128 | */ 129 | public Pet getPet(String name, boolean ignoreNew) { 130 | name = name.toLowerCase(); 131 | for (Pet pet : getPetsInternal()) { 132 | if (!ignoreNew || !pet.isNew()) { 133 | String compName = pet.getName(); 134 | compName = compName.toLowerCase(); 135 | if (compName.equals(name)) { 136 | return pet; 137 | } 138 | } 139 | } 140 | return null; 141 | } 142 | 143 | @Override 144 | public String toString() { 145 | return new ToStringCreator(this) 146 | 147 | .append("id", this.getId()).append("new", this.isNew()) 148 | .append("lastName", this.getLastName()) 149 | .append("firstName", this.getFirstName()).append("address", this.address) 150 | .append("city", this.city).append("telephone", this.telephone).toString(); 151 | } 152 | } 153 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/OwnerController.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import java.util.Collection; 19 | import java.util.Map; 20 | 21 | import javax.validation.Valid; 22 | 23 | import org.springframework.stereotype.Controller; 24 | import org.springframework.ui.Model; 25 | import org.springframework.validation.BindingResult; 26 | import org.springframework.web.bind.WebDataBinder; 27 | import org.springframework.web.bind.annotation.GetMapping; 28 | import org.springframework.web.bind.annotation.InitBinder; 29 | import org.springframework.web.bind.annotation.PathVariable; 30 | import org.springframework.web.bind.annotation.PostMapping; 31 | import org.springframework.web.servlet.ModelAndView; 32 | 33 | /** 34 | * @author Juergen Hoeller 35 | * @author Ken Krebs 36 | * @author Arjen Poutsma 37 | * @author Michael Isvy 38 | */ 39 | @Controller 40 | public class OwnerController { 41 | 42 | private static final String VIEWS_OWNER_CREATE_OR_UPDATE_FORM = "owners/createOrUpdateOwnerForm"; 43 | private final OwnerRepository owners; 44 | 45 | public OwnerController(OwnerRepository clinicService) { 46 | this.owners = clinicService; 47 | } 48 | 49 | @InitBinder 50 | public void setAllowedFields(WebDataBinder dataBinder) { 51 | dataBinder.setDisallowedFields("id"); 52 | } 53 | 54 | @GetMapping("/owners/new") 55 | public String initCreationForm(Map model) { 56 | Owner owner = new Owner(); 57 | model.put("owner", owner); 58 | return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; 59 | } 60 | 61 | @PostMapping("/owners/new") 62 | public String processCreationForm(@Valid Owner owner, BindingResult result) { 63 | if (result.hasErrors()) { 64 | return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; 65 | } 66 | else { 67 | this.owners.save(owner); 68 | return "redirect:/owners/" + owner.getId(); 69 | } 70 | } 71 | 72 | @GetMapping("/owners/find") 73 | public String initFindForm(Map model) { 74 | model.put("owner", new Owner()); 75 | return "owners/findOwners"; 76 | } 77 | 78 | @GetMapping("/owners") 79 | public String processFindForm(Owner owner, BindingResult result, 80 | Map model) { 81 | 82 | // allow parameterless GET request for /owners to return all records 83 | if (owner.getLastName() == null) { 84 | owner.setLastName(""); // empty string signifies broadest possible search 85 | } 86 | 87 | // find owners by last name 88 | Collection results = this.owners.findByLastName(owner.getLastName()); 89 | if (results.isEmpty()) { 90 | // no owners found 91 | result.rejectValue("lastName", "notFound", "not found"); 92 | return "owners/findOwners"; 93 | } 94 | else if (results.size() == 1) { 95 | // 1 owner found 96 | owner = results.iterator().next(); 97 | return "redirect:/owners/" + owner.getId(); 98 | } 99 | else { 100 | // multiple owners found 101 | model.put("selections", results); 102 | return "owners/ownersList"; 103 | } 104 | } 105 | 106 | @GetMapping("/owners/{ownerId}/edit") 107 | public String initUpdateOwnerForm(@PathVariable("ownerId") int ownerId, Model model) { 108 | Owner owner = this.owners.findById(ownerId); 109 | model.addAttribute(owner); 110 | return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; 111 | } 112 | 113 | @PostMapping("/owners/{ownerId}/edit") 114 | public String processUpdateOwnerForm(@Valid Owner owner, BindingResult result, 115 | @PathVariable("ownerId") int ownerId) { 116 | if (result.hasErrors()) { 117 | return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; 118 | } 119 | else { 120 | owner.setId(ownerId); 121 | this.owners.save(owner); 122 | return "redirect:/owners/{ownerId}"; 123 | } 124 | } 125 | 126 | /** 127 | * Custom handler for displaying an owner. 128 | * 129 | * @param ownerId the ID of the owner to display 130 | * @return a ModelMap with the model attributes for the view 131 | */ 132 | @GetMapping("/owners/{ownerId}") 133 | public ModelAndView showOwner(@PathVariable("ownerId") int ownerId) { 134 | ModelAndView mav = new ModelAndView("owners/ownerDetails"); 135 | mav.addObject(this.owners.findById(ownerId)); 136 | return mav; 137 | } 138 | 139 | } 140 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import java.util.Collection; 19 | 20 | import org.springframework.data.jpa.repository.Query; 21 | import org.springframework.data.repository.Repository; 22 | import org.springframework.data.repository.query.Param; 23 | import org.springframework.transaction.annotation.Transactional; 24 | 25 | /** 26 | * Repository class for Owner domain objects All method names are compliant with Spring Data naming 27 | * 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 28 | * 29 | * @author Ken Krebs 30 | * @author Juergen Hoeller 31 | * @author Sam Brannen 32 | * @author Michael Isvy 33 | */ 34 | public interface OwnerRepository extends Repository { 35 | 36 | /** 37 | * Retrieve {@link Owner}s from the data store by last name, returning all owners 38 | * whose last name starts with the given name. 39 | * @param lastName Value to search for 40 | * @return a Collection of matching {@link Owner}s (or an empty Collection if none 41 | * found) 42 | */ 43 | @Query("SELECT DISTINCT owner FROM Owner owner left join fetch owner.pets WHERE owner.lastName LIKE :lastName%") 44 | @Transactional(readOnly = true) 45 | Collection findByLastName(@Param("lastName") String lastName); 46 | 47 | /** 48 | * Retrieve an {@link Owner} from the data store by id. 49 | * @param id the id to search for 50 | * @return the {@link Owner} if found 51 | */ 52 | @Query("SELECT owner FROM Owner owner left join fetch owner.pets WHERE owner.id =:id") 53 | @Transactional(readOnly = true) 54 | Owner findById(@Param("id") Integer id); 55 | 56 | /** 57 | * Save an {@link Owner} to the data store, either inserting or updating it. 58 | * @param owner the {@link Owner} to save 59 | */ 60 | void save(Owner owner); 61 | 62 | 63 | } 64 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/Pet.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import java.time.LocalDate; 19 | import java.util.ArrayList; 20 | import java.util.Collections; 21 | import java.util.HashSet; 22 | import java.util.LinkedHashSet; 23 | import java.util.List; 24 | import java.util.Set; 25 | 26 | import javax.persistence.CascadeType; 27 | import javax.persistence.Column; 28 | import javax.persistence.Entity; 29 | import javax.persistence.FetchType; 30 | import javax.persistence.JoinColumn; 31 | import javax.persistence.ManyToOne; 32 | import javax.persistence.OneToMany; 33 | import javax.persistence.Table; 34 | 35 | import org.springframework.beans.support.MutableSortDefinition; 36 | import org.springframework.beans.support.PropertyComparator; 37 | import org.springframework.format.annotation.DateTimeFormat; 38 | import org.springframework.samples.petclinic.model.NamedEntity; 39 | import org.springframework.samples.petclinic.visit.Visit; 40 | 41 | /** 42 | * Simple business object representing a pet. 43 | * 44 | * @author Ken Krebs 45 | * @author Juergen Hoeller 46 | * @author Sam Brannen 47 | */ 48 | @Entity 49 | @Table(name = "pets") 50 | public class Pet extends NamedEntity { 51 | 52 | @Column(name = "birth_date") 53 | @DateTimeFormat(pattern = "yyyy-MM-dd") 54 | private LocalDate birthDate; 55 | 56 | @ManyToOne 57 | @JoinColumn(name = "type_id") 58 | private PetType type; 59 | 60 | @ManyToOne 61 | @JoinColumn(name = "owner_id") 62 | private Owner owner; 63 | 64 | @OneToMany(cascade = CascadeType.ALL, mappedBy = "petId", fetch = FetchType.EAGER) 65 | private Set visits = new LinkedHashSet<>(); 66 | 67 | public void setBirthDate(LocalDate birthDate) { 68 | this.birthDate = birthDate; 69 | } 70 | 71 | public LocalDate getBirthDate() { 72 | return this.birthDate; 73 | } 74 | 75 | public PetType getType() { 76 | return this.type; 77 | } 78 | 79 | public void setType(PetType type) { 80 | this.type = type; 81 | } 82 | 83 | public Owner getOwner() { 84 | return this.owner; 85 | } 86 | 87 | protected void setOwner(Owner owner) { 88 | this.owner = owner; 89 | } 90 | 91 | protected Set getVisitsInternal() { 92 | if (this.visits == null) { 93 | this.visits = new HashSet<>(); 94 | } 95 | return this.visits; 96 | } 97 | 98 | protected void setVisitsInternal(Set visits) { 99 | this.visits = visits; 100 | } 101 | 102 | public List getVisits() { 103 | List sortedVisits = new ArrayList<>(getVisitsInternal()); 104 | PropertyComparator.sort(sortedVisits, 105 | new MutableSortDefinition("date", false, false)); 106 | return Collections.unmodifiableList(sortedVisits); 107 | } 108 | 109 | public void addVisit(Visit visit) { 110 | getVisitsInternal().add(visit); 111 | visit.setPetId(this.getId()); 112 | } 113 | 114 | } 115 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/PetController.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import java.util.Collection; 19 | 20 | import javax.validation.Valid; 21 | 22 | import org.springframework.stereotype.Controller; 23 | import org.springframework.ui.ModelMap; 24 | import org.springframework.util.StringUtils; 25 | import org.springframework.validation.BindingResult; 26 | import org.springframework.web.bind.WebDataBinder; 27 | import org.springframework.web.bind.annotation.GetMapping; 28 | import org.springframework.web.bind.annotation.InitBinder; 29 | import org.springframework.web.bind.annotation.ModelAttribute; 30 | import org.springframework.web.bind.annotation.PathVariable; 31 | import org.springframework.web.bind.annotation.PostMapping; 32 | import org.springframework.web.bind.annotation.RequestMapping; 33 | 34 | /** 35 | * @author Juergen Hoeller 36 | * @author Ken Krebs 37 | * @author Arjen Poutsma 38 | */ 39 | @Controller 40 | @RequestMapping("/owners/{ownerId}") 41 | public class PetController { 42 | 43 | private static final String VIEWS_PETS_CREATE_OR_UPDATE_FORM = "pets/createOrUpdatePetForm"; 44 | private final PetRepository pets; 45 | private final OwnerRepository owners; 46 | 47 | public PetController(PetRepository pets, OwnerRepository owners) { 48 | this.pets = pets; 49 | this.owners = owners; 50 | } 51 | 52 | @ModelAttribute("types") 53 | public Collection populatePetTypes() { 54 | return this.pets.findPetTypes(); 55 | } 56 | 57 | @ModelAttribute("owner") 58 | public Owner findOwner(@PathVariable("ownerId") int ownerId) { 59 | return this.owners.findById(ownerId); 60 | } 61 | 62 | @InitBinder("owner") 63 | public void initOwnerBinder(WebDataBinder dataBinder) { 64 | dataBinder.setDisallowedFields("id"); 65 | } 66 | 67 | @InitBinder("pet") 68 | public void initPetBinder(WebDataBinder dataBinder) { 69 | dataBinder.setValidator(new PetValidator()); 70 | } 71 | 72 | @GetMapping("/pets/new") 73 | public String initCreationForm(Owner owner, ModelMap model) { 74 | Pet pet = new Pet(); 75 | owner.addPet(pet); 76 | model.put("pet", pet); 77 | return VIEWS_PETS_CREATE_OR_UPDATE_FORM; 78 | } 79 | 80 | @PostMapping("/pets/new") 81 | public String processCreationForm(Owner owner, @Valid Pet pet, BindingResult result, 82 | ModelMap model) { 83 | if (StringUtils.hasLength(pet.getName()) && pet.isNew() 84 | && owner.getPet(pet.getName(), true) != null) { 85 | result.rejectValue("name", "duplicate", "already exists"); 86 | } 87 | owner.addPet(pet); 88 | if (result.hasErrors()) { 89 | model.put("pet", pet); 90 | return VIEWS_PETS_CREATE_OR_UPDATE_FORM; 91 | } 92 | else { 93 | this.pets.save(pet); 94 | return "redirect:/owners/{ownerId}"; 95 | } 96 | } 97 | 98 | @GetMapping("/pets/{petId}/edit") 99 | public String initUpdateForm(@PathVariable("petId") int petId, ModelMap model) { 100 | Pet pet = this.pets.findById(petId); 101 | model.put("pet", pet); 102 | return VIEWS_PETS_CREATE_OR_UPDATE_FORM; 103 | } 104 | 105 | @PostMapping("/pets/{petId}/edit") 106 | public String processUpdateForm(@Valid Pet pet, BindingResult result, Owner owner, 107 | ModelMap model) { 108 | if (result.hasErrors()) { 109 | pet.setOwner(owner); 110 | model.put("pet", pet); 111 | return VIEWS_PETS_CREATE_OR_UPDATE_FORM; 112 | } 113 | else { 114 | owner.addPet(pet); 115 | this.pets.save(pet); 116 | return "redirect:/owners/{ownerId}"; 117 | } 118 | } 119 | 120 | } 121 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/PetRepository.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import java.util.List; 19 | 20 | import org.springframework.data.jpa.repository.Query; 21 | import org.springframework.data.repository.Repository; 22 | import org.springframework.transaction.annotation.Transactional; 23 | 24 | /** 25 | * Repository class for Pet domain objects All method names are compliant with Spring Data naming 26 | * 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 27 | * 28 | * @author Ken Krebs 29 | * @author Juergen Hoeller 30 | * @author Sam Brannen 31 | * @author Michael Isvy 32 | */ 33 | public interface PetRepository extends Repository { 34 | 35 | /** 36 | * Retrieve all {@link PetType}s from the data store. 37 | * @return a Collection of {@link PetType}s. 38 | */ 39 | @Query("SELECT ptype FROM PetType ptype ORDER BY ptype.name") 40 | @Transactional(readOnly = true) 41 | List findPetTypes(); 42 | 43 | /** 44 | * Retrieve a {@link Pet} from the data store by id. 45 | * @param id the id to search for 46 | * @return the {@link Pet} if found 47 | */ 48 | @Transactional(readOnly = true) 49 | Pet findById(Integer id); 50 | 51 | /** 52 | * Save a {@link Pet} to the data store, either inserting or updating it. 53 | * @param pet the {@link Pet} to save 54 | */ 55 | void save(Pet pet); 56 | 57 | } 58 | 59 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/PetType.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import javax.persistence.Entity; 19 | import javax.persistence.Table; 20 | 21 | import org.springframework.samples.petclinic.model.NamedEntity; 22 | 23 | /** 24 | * @author Juergen Hoeller 25 | * Can be Cat, Dog, Hamster... 26 | */ 27 | @Entity 28 | @Table(name = "types") 29 | public class PetType extends NamedEntity { 30 | 31 | } 32 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/PetTypeFormatter.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | 19 | import java.text.ParseException; 20 | import java.util.Collection; 21 | import java.util.Locale; 22 | 23 | import org.springframework.beans.factory.annotation.Autowired; 24 | import org.springframework.format.Formatter; 25 | import org.springframework.stereotype.Component; 26 | 27 | /** 28 | * Instructs Spring MVC on how to parse and print elements of type 'PetType'. Starting from Spring 3.0, Formatters have 29 | * come as an improvement in comparison to legacy PropertyEditors. See the following links for more details: - The 30 | * Spring ref doc: http://static.springsource.org/spring/docs/current/spring-framework-reference/html/validation.html#format-Formatter-SPI 31 | * - A nice blog entry from Gordon Dickens: http://gordondickens.com/wordpress/2010/09/30/using-spring-3-0-custom-type-converter/ 32 | *

33 | * 34 | * @author Mark Fisher 35 | * @author Juergen Hoeller 36 | * @author Michael Isvy 37 | */ 38 | @Component 39 | public class PetTypeFormatter implements Formatter { 40 | 41 | private final PetRepository pets; 42 | 43 | 44 | @Autowired 45 | public PetTypeFormatter(PetRepository pets) { 46 | this.pets = pets; 47 | } 48 | 49 | @Override 50 | public String print(PetType petType, Locale locale) { 51 | return petType.getName(); 52 | } 53 | 54 | @Override 55 | public PetType parse(String text, Locale locale) throws ParseException { 56 | Collection findPetTypes = this.pets.findPetTypes(); 57 | for (PetType type : findPetTypes) { 58 | if (type.getName().equals(text)) { 59 | return type; 60 | } 61 | } 62 | throw new ParseException("type not found: " + text, 0); 63 | } 64 | 65 | } 66 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/PetValidator.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import org.springframework.util.StringUtils; 19 | import org.springframework.validation.Errors; 20 | import org.springframework.validation.Validator; 21 | 22 | /** 23 | * Validator for Pet forms. 24 | *

25 | * We're not using Bean Validation annotations here because it is easier to define such validation rule in Java. 26 | *

27 | * 28 | * @author Ken Krebs 29 | * @author Juergen Hoeller 30 | */ 31 | public class PetValidator implements Validator { 32 | 33 | private static final String REQUIRED = "required"; 34 | 35 | @Override 36 | public void validate(Object obj, Errors errors) { 37 | Pet pet = (Pet) obj; 38 | String name = pet.getName(); 39 | // name validation 40 | if (!StringUtils.hasLength(name)) { 41 | errors.rejectValue("name", REQUIRED, REQUIRED); 42 | } 43 | 44 | // type validation 45 | if (pet.isNew() && pet.getType() == null) { 46 | errors.rejectValue("type", REQUIRED, REQUIRED); 47 | } 48 | 49 | // birth date validation 50 | if (pet.getBirthDate() == null) { 51 | errors.rejectValue("birthDate", REQUIRED, REQUIRED); 52 | } 53 | } 54 | 55 | /** 56 | * This Validator validates *just* Pet instances 57 | */ 58 | @Override 59 | public boolean supports(Class clazz) { 60 | return Pet.class.isAssignableFrom(clazz); 61 | } 62 | 63 | 64 | } 65 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/owner/VisitController.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.owner; 17 | 18 | import java.util.Map; 19 | 20 | import javax.validation.Valid; 21 | 22 | import org.springframework.samples.petclinic.visit.Visit; 23 | import org.springframework.samples.petclinic.visit.VisitRepository; 24 | import org.springframework.stereotype.Controller; 25 | import org.springframework.validation.BindingResult; 26 | import org.springframework.web.bind.WebDataBinder; 27 | import org.springframework.web.bind.annotation.GetMapping; 28 | import org.springframework.web.bind.annotation.InitBinder; 29 | import org.springframework.web.bind.annotation.ModelAttribute; 30 | import org.springframework.web.bind.annotation.PathVariable; 31 | import org.springframework.web.bind.annotation.PostMapping; 32 | 33 | /** 34 | * @author Juergen Hoeller 35 | * @author Ken Krebs 36 | * @author Arjen Poutsma 37 | * @author Michael Isvy 38 | * @author Dave Syer 39 | */ 40 | @Controller 41 | public class VisitController { 42 | 43 | private final VisitRepository visits; 44 | private final PetRepository pets; 45 | 46 | public VisitController(VisitRepository visits, PetRepository pets) { 47 | this.visits = visits; 48 | this.pets = pets; 49 | } 50 | 51 | @InitBinder 52 | public void setAllowedFields(WebDataBinder dataBinder) { 53 | dataBinder.setDisallowedFields("id"); 54 | } 55 | 56 | /** 57 | * Called before each and every @RequestMapping annotated method. 2 goals: - Make sure 58 | * we always have fresh data - Since we do not use the session scope, make sure that 59 | * Pet object always has an id (Even though id is not part of the form fields) 60 | * 61 | * @param petId 62 | * @return Pet 63 | */ 64 | @ModelAttribute("visit") 65 | public Visit loadPetWithVisit(@PathVariable("petId") int petId, 66 | Map model) { 67 | Pet pet = this.pets.findById(petId); 68 | model.put("pet", pet); 69 | Visit visit = new Visit(); 70 | pet.addVisit(visit); 71 | return visit; 72 | } 73 | 74 | // Spring MVC calls method loadPetWithVisit(...) before initNewVisitForm is called 75 | @GetMapping("/owners/*/pets/{petId}/visits/new") 76 | public String initNewVisitForm(@PathVariable("petId") int petId, 77 | Map model) { 78 | return "pets/createOrUpdateVisitForm"; 79 | } 80 | 81 | // Spring MVC calls method loadPetWithVisit(...) before processNewVisitForm is called 82 | @PostMapping("/owners/{ownerId}/pets/{petId}/visits/new") 83 | public String processNewVisitForm(@Valid Visit visit, BindingResult result) { 84 | if (result.hasErrors()) { 85 | return "pets/createOrUpdateVisitForm"; 86 | } 87 | else { 88 | this.visits.save(visit); 89 | return "redirect:/owners/{ownerId}"; 90 | } 91 | } 92 | 93 | } 94 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/system/CacheConfiguration.java: -------------------------------------------------------------------------------- 1 | package org.springframework.samples.petclinic.system; 2 | 3 | import org.springframework.boot.autoconfigure.cache.JCacheManagerCustomizer; 4 | import org.springframework.cache.annotation.EnableCaching; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | 8 | import javax.cache.configuration.MutableConfiguration; 9 | 10 | /** 11 | * Cache configuration intended for caches providing the JCache API. This configuration creates the used cache for the 12 | * application and enables statistics that become accessible via JMX. 13 | */ 14 | @Configuration 15 | @EnableCaching 16 | class CacheConfiguration { 17 | 18 | @Bean 19 | public JCacheManagerCustomizer petclinicCacheConfigurationCustomizer() { 20 | return cm -> { 21 | cm.createCache("vets", cacheConfiguration()); 22 | }; 23 | } 24 | 25 | /** 26 | * Create a simple configuration that enable statistics via the JCache programmatic configuration API. 27 | *

28 | * Within the configuration object that is provided by the JCache API standard, there is only a very limited set of 29 | * configuration options. The really relevant configuration options (like the size limit) must be set via a 30 | * configuration mechanism that is provided by the selected JCache implementation. 31 | */ 32 | private javax.cache.configuration.Configuration cacheConfiguration() { 33 | return new MutableConfiguration<>().setStatisticsEnabled(true); 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/system/CrashController.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.system; 17 | 18 | import org.springframework.stereotype.Controller; 19 | import org.springframework.web.bind.annotation.GetMapping; 20 | 21 | /** 22 | * Controller used to showcase what happens when an exception is thrown 23 | * 24 | * @author Michael Isvy 25 | *

26 | * Also see how a view that resolves to "error" has been added ("error.html"). 27 | */ 28 | @Controller 29 | public class CrashController { 30 | 31 | @GetMapping("/oups") 32 | public String triggerException() { 33 | throw new RuntimeException("Expected: controller used to showcase what " 34 | + "happens when an exception is thrown"); 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/system/WelcomeController.java: -------------------------------------------------------------------------------- 1 | package org.springframework.samples.petclinic.system; 2 | 3 | import org.springframework.stereotype.Controller; 4 | import org.springframework.web.bind.annotation.GetMapping; 5 | 6 | @Controller 7 | public class WelcomeController { 8 | 9 | @GetMapping("/") 10 | public String welcome() { 11 | return "welcome"; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/vet/Specialty.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.vet; 17 | 18 | import java.io.Serializable; 19 | 20 | import javax.persistence.Entity; 21 | import javax.persistence.Table; 22 | 23 | import org.springframework.samples.petclinic.model.NamedEntity; 24 | 25 | /** 26 | * Models a {@link Vet Vet's} specialty (for example, dentistry). 27 | * 28 | * @author Juergen Hoeller 29 | */ 30 | @Entity 31 | @Table(name = "specialties") 32 | public class Specialty extends NamedEntity implements Serializable { 33 | 34 | } 35 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/vet/Vet.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.vet; 17 | 18 | import java.util.ArrayList; 19 | import java.util.Collections; 20 | import java.util.HashSet; 21 | import java.util.List; 22 | import java.util.Set; 23 | 24 | import javax.persistence.Entity; 25 | import javax.persistence.FetchType; 26 | import javax.persistence.JoinColumn; 27 | import javax.persistence.JoinTable; 28 | import javax.persistence.ManyToMany; 29 | import javax.persistence.Table; 30 | import javax.xml.bind.annotation.XmlElement; 31 | 32 | import org.springframework.beans.support.MutableSortDefinition; 33 | import org.springframework.beans.support.PropertyComparator; 34 | import org.springframework.samples.petclinic.model.Person; 35 | 36 | /** 37 | * Simple JavaBean domain object representing a veterinarian. 38 | * 39 | * @author Ken Krebs 40 | * @author Juergen Hoeller 41 | * @author Sam Brannen 42 | * @author Arjen Poutsma 43 | */ 44 | @Entity 45 | @Table(name = "vets") 46 | public class Vet extends Person { 47 | 48 | @ManyToMany(fetch = FetchType.EAGER) 49 | @JoinTable(name = "vet_specialties", joinColumns = @JoinColumn(name = "vet_id"), inverseJoinColumns = @JoinColumn(name = "specialty_id")) 50 | private Set specialties; 51 | 52 | protected Set getSpecialtiesInternal() { 53 | if (this.specialties == null) { 54 | this.specialties = new HashSet<>(); 55 | } 56 | return this.specialties; 57 | } 58 | 59 | protected void setSpecialtiesInternal(Set specialties) { 60 | this.specialties = specialties; 61 | } 62 | 63 | @XmlElement 64 | public List getSpecialties() { 65 | List sortedSpecs = new ArrayList<>(getSpecialtiesInternal()); 66 | PropertyComparator.sort(sortedSpecs, 67 | new MutableSortDefinition("name", true, true)); 68 | return Collections.unmodifiableList(sortedSpecs); 69 | } 70 | 71 | public int getNrOfSpecialties() { 72 | return getSpecialtiesInternal().size(); 73 | } 74 | 75 | public void addSpecialty(Specialty specialty) { 76 | getSpecialtiesInternal().add(specialty); 77 | } 78 | 79 | } 80 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/vet/VetController.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.vet; 17 | 18 | import java.util.Map; 19 | 20 | import org.springframework.stereotype.Controller; 21 | import org.springframework.web.bind.annotation.GetMapping; 22 | import org.springframework.web.bind.annotation.ResponseBody; 23 | 24 | /** 25 | * @author Juergen Hoeller 26 | * @author Mark Fisher 27 | * @author Ken Krebs 28 | * @author Arjen Poutsma 29 | */ 30 | @Controller 31 | public class VetController { 32 | 33 | private final VetRepository vets; 34 | 35 | public VetController(VetRepository clinicService) { 36 | this.vets = clinicService; 37 | } 38 | 39 | @GetMapping("/vets.html") 40 | public String showVetList(Map model) { 41 | // Here we are returning an object of type 'Vets' rather than a collection of Vet 42 | // objects so it is simpler for Object-Xml mapping 43 | Vets vets = new Vets(); 44 | vets.getVetList().addAll(this.vets.findAll()); 45 | model.put("vets", vets); 46 | return "vets/vetList"; 47 | } 48 | 49 | @GetMapping({ "/vets" }) 50 | public @ResponseBody Vets showResourcesVetList() { 51 | // Here we are returning an object of type 'Vets' rather than a collection of Vet 52 | // objects so it is simpler for JSon/Object mapping 53 | Vets vets = new Vets(); 54 | vets.getVetList().addAll(this.vets.findAll()); 55 | return vets; 56 | } 57 | 58 | } 59 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/vet/VetRepository.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.vet; 17 | 18 | import java.util.Collection; 19 | 20 | import org.springframework.cache.annotation.Cacheable; 21 | import org.springframework.dao.DataAccessException; 22 | import org.springframework.data.repository.Repository; 23 | import org.springframework.transaction.annotation.Transactional; 24 | 25 | /** 26 | * Repository class for Vet domain objects All method names are compliant with Spring Data naming 27 | * 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 28 | * 29 | * @author Ken Krebs 30 | * @author Juergen Hoeller 31 | * @author Sam Brannen 32 | * @author Michael Isvy 33 | */ 34 | public interface VetRepository extends Repository { 35 | 36 | /** 37 | * Retrieve all Vets from the data store. 38 | * 39 | * @return a Collection of Vets 40 | */ 41 | @Transactional(readOnly = true) 42 | @Cacheable("vets") 43 | Collection findAll() throws DataAccessException; 44 | 45 | 46 | } 47 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/vet/Vets.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.vet; 17 | 18 | import java.util.ArrayList; 19 | import java.util.List; 20 | 21 | import javax.xml.bind.annotation.XmlElement; 22 | import javax.xml.bind.annotation.XmlRootElement; 23 | 24 | /** 25 | * Simple domain object representing a list of veterinarians. Mostly here to be used for the 'vets' {@link 26 | * org.springframework.web.servlet.view.xml.MarshallingView}. 27 | * 28 | * @author Arjen Poutsma 29 | */ 30 | @XmlRootElement 31 | public class Vets { 32 | 33 | private List vets; 34 | 35 | @XmlElement 36 | public List getVetList() { 37 | if (vets == null) { 38 | vets = new ArrayList<>(); 39 | } 40 | return vets; 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/visit/Visit.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.visit; 17 | 18 | import java.time.LocalDate; 19 | 20 | import javax.persistence.Column; 21 | import javax.persistence.Entity; 22 | import javax.persistence.Table; 23 | import javax.validation.constraints.NotEmpty; 24 | 25 | import org.springframework.format.annotation.DateTimeFormat; 26 | import org.springframework.samples.petclinic.model.BaseEntity; 27 | 28 | /** 29 | * Simple JavaBean domain object representing a visit. 30 | * 31 | * @author Ken Krebs 32 | * @author Dave Syer 33 | */ 34 | @Entity 35 | @Table(name = "visits") 36 | public class Visit extends BaseEntity { 37 | 38 | @Column(name = "visit_date") 39 | @DateTimeFormat(pattern = "yyyy-MM-dd") 40 | private LocalDate date; 41 | 42 | @NotEmpty 43 | @Column(name = "description") 44 | private String description; 45 | 46 | @Column(name = "pet_id") 47 | private Integer petId; 48 | 49 | /** 50 | * Creates a new instance of Visit for the current date 51 | */ 52 | public Visit() { 53 | this.date = LocalDate.now(); 54 | } 55 | 56 | public LocalDate getDate() { 57 | return this.date; 58 | } 59 | 60 | public void setDate(LocalDate date) { 61 | this.date = date; 62 | } 63 | 64 | public String getDescription() { 65 | return this.description; 66 | } 67 | 68 | public void setDescription(String description) { 69 | this.description = description; 70 | } 71 | 72 | public Integer getPetId() { 73 | return this.petId; 74 | } 75 | 76 | public void setPetId(Integer petId) { 77 | this.petId = petId; 78 | } 79 | 80 | } 81 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/java/org/springframework/samples/petclinic/visit/VisitRepository.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.visit; 17 | 18 | import java.util.List; 19 | 20 | import org.springframework.dao.DataAccessException; 21 | import org.springframework.data.repository.Repository; 22 | import org.springframework.samples.petclinic.model.BaseEntity; 23 | 24 | /** 25 | * Repository class for Visit domain objects All method names are compliant with Spring Data naming 26 | * 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 27 | * 28 | * @author Ken Krebs 29 | * @author Juergen Hoeller 30 | * @author Sam Brannen 31 | * @author Michael Isvy 32 | */ 33 | public interface VisitRepository extends Repository { 34 | 35 | /** 36 | * Save a Visit to the data store, either inserting or updating it. 37 | * 38 | * @param visit the Visit to save 39 | * @see BaseEntity#isNew 40 | */ 41 | void save(Visit visit) throws DataAccessException; 42 | 43 | List findByPetId(Integer petId); 44 | 45 | } 46 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/less/header.less: -------------------------------------------------------------------------------- 1 | .navbar { 2 | border-top: 4px solid #6db33f; 3 | background-color: #34302d; 4 | margin-bottom: 0px; 5 | border-bottom: 0; 6 | border-left: 0; 7 | border-right: 0; 8 | } 9 | 10 | .navbar a.navbar-brand { 11 | background: url("../images/spring-logo-dataflow.png") -1px -1px no-repeat; 12 | margin: 12px 0 6px; 13 | width: 229px; 14 | height: 46px; 15 | display: inline-block; 16 | text-decoration: none; 17 | padding: 0; 18 | } 19 | 20 | .navbar a.navbar-brand span { 21 | display: block; 22 | width: 229px; 23 | height: 46px; 24 | background: url("../images/spring-logo-dataflow.png") -1px -48px no-repeat; 25 | opacity: 0; 26 | -moz-transition: opacity 0.12s ease-in-out; 27 | -webkit-transition: opacity 0.12s ease-in-out; 28 | -o-transition: opacity 0.12s ease-in-out; 29 | } 30 | 31 | .navbar a:hover.navbar-brand span { 32 | opacity: 1; 33 | } 34 | 35 | .navbar li > a, .navbar-text { 36 | font-family: "montserratregular", sans-serif; 37 | text-shadow: none; 38 | font-size: 14px; 39 | 40 | /* line-height: 14px; */ 41 | padding: 28px 20px; 42 | transition: all 0.15s; 43 | -webkit-transition: all 0.15s; 44 | -moz-transition: all 0.15s; 45 | -o-transition: all 0.15s; 46 | -ms-transition: all 0.15s; 47 | } 48 | 49 | .navbar li > a { 50 | text-transform: uppercase; 51 | } 52 | 53 | .navbar .navbar-text { 54 | margin-top: 0; 55 | margin-bottom: 0; 56 | } 57 | .navbar li:hover > a { 58 | color: #eeeeee; 59 | background-color: #6db33f; 60 | } 61 | 62 | .navbar-toggle { 63 | border-width: 0; 64 | 65 | .icon-bar + .icon-bar { 66 | margin-top: 3px; 67 | } 68 | .icon-bar { 69 | width: 19px; 70 | height: 3px; 71 | } 72 | 73 | } 74 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/less/petclinic.less: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016 the original author or authors. 3 | * 4 | * You may obtain a copy of the License at 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * Unless required by applicable law or agreed to in writing, software 9 | * distributed under the License is distributed on an "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 | * See the License for the specific language governing permissions and 12 | * limitations under the License. 13 | */ 14 | @icon-font-path: "../../webjars/bootstrap/fonts/"; 15 | 16 | @spring-green: #6db33f; 17 | @spring-dark-green: #5fa134; 18 | @spring-brown: #34302D; 19 | @spring-grey: #838789; 20 | @spring-light-grey: #f1f1f1; 21 | 22 | @body-bg: @spring-light-grey; 23 | @text-color: @spring-brown; 24 | @link-color: @spring-dark-green; 25 | @link-hover-color: @spring-dark-green; 26 | 27 | @navbar-default-link-color: @spring-light-grey; 28 | @navbar-default-link-active-color: @spring-light-grey; 29 | @navbar-default-link-hover-color: @spring-light-grey; 30 | @navbar-default-link-hover-bg: @spring-green; 31 | @navbar-default-toggle-icon-bar-bg: @spring-light-grey; 32 | @navbar-default-toggle-hover-bg: transparent; 33 | @navbar-default-link-active-bg: @spring-green; 34 | 35 | @border-radius-base: 0; 36 | @border-radius-large: 0; 37 | @border-radius-small: 0; 38 | 39 | @btn-default-color: @spring-light-grey; 40 | @btn-default-bg: @spring-brown; 41 | @btn-default-border: @spring-green; 42 | 43 | @nav-tabs-active-link-hover-color: @spring-light-grey; 44 | @nav-tabs-active-link-hover-bg: @spring-brown; 45 | @nav-tabs-active-link-hover-border-color: @spring-brown; 46 | @nav-tabs-border-color: @spring-brown; 47 | 48 | @pagination-active-bg: @spring-brown; 49 | @pagination-active-border: @spring-green; 50 | @table-border-color: @spring-brown; 51 | 52 | .table > thead > tr > th { 53 | background-color: lighten(@spring-brown, 3%); 54 | color: @spring-light-grey; 55 | } 56 | 57 | .table-filter { 58 | background-color: @spring-brown; 59 | padding: 9px 12px; 60 | } 61 | 62 | .nav > li > a { 63 | color: @spring-grey; 64 | } 65 | 66 | .btn-default { 67 | border-width: 2px; 68 | transition: border 0.15s; 69 | -webkit-transition: border 0.15s; 70 | -moz-transition: border 0.15s; 71 | -o-transition: border 0.15s; 72 | -ms-transition: border 0.15s; 73 | 74 | &:hover, 75 | &:focus, 76 | &:active, 77 | &.active, 78 | .open .dropdown-toggle& { 79 | background-color: @spring-brown; 80 | border-color: @spring-brown; 81 | } 82 | } 83 | 84 | 85 | .container .text-muted { 86 | margin: 20px 0; 87 | } 88 | 89 | code { 90 | font-size: 80%; 91 | } 92 | 93 | .xd-container { 94 | margin-top: 40px; 95 | margin-bottom: 100px; 96 | padding-left: 5px; 97 | padding-right: 5px; 98 | } 99 | 100 | h1 { 101 | margin-bottom: 15px 102 | } 103 | 104 | .index-page--subtitle { 105 | font-size: 16px; 106 | line-height: 24px; 107 | margin: 0 0 30px; 108 | } 109 | 110 | .form-horizontal button.btn-inverse { 111 | margin-left: 32px; 112 | } 113 | 114 | #job-params-modal .modal-dialog { 115 | width: 90%; 116 | margin-left:auto; 117 | margin-right:auto; 118 | } 119 | 120 | [ng-cloak].splash { 121 | display: block !important; 122 | } 123 | [ng-cloak] { 124 | display: none; 125 | } 126 | 127 | .splash { 128 | background: @spring-green; 129 | color: @spring-brown; 130 | display: none; 131 | } 132 | 133 | .error-page { 134 | margin-top: 100px; 135 | text-align: center; 136 | } 137 | 138 | .error-page .error-title { 139 | font-size: 24px; 140 | line-height: 24px; 141 | margin: 30px 0 0; 142 | } 143 | 144 | table td { 145 | vertical-align: middle; 146 | } 147 | 148 | table td .progress { 149 | margin-bottom: 0; 150 | } 151 | 152 | table td.action-column { 153 | width: 1px; 154 | } 155 | 156 | .help-block { 157 | color: lighten(@text-color, 50%); // lighten the text some for contrast 158 | } 159 | 160 | .xd-containers { 161 | font-size: 15px; 162 | } 163 | 164 | .cluster-view > table td { 165 | vertical-align: top; 166 | } 167 | 168 | .cluster-view .label, .cluster-view .column-block { 169 | display: block; 170 | } 171 | 172 | .cluster-view .input-group-addon { 173 | width: 0%; 174 | } 175 | 176 | .cluster-view { 177 | margin-bottom: 0; 178 | } 179 | 180 | .deployment-status-deployed { 181 | .label-success; 182 | } 183 | 184 | .deployment-status-incomplete { 185 | .label-warning; 186 | } 187 | 188 | .deployment-status-failed { 189 | .label-danger; 190 | } 191 | 192 | .deployment-status-deploying { 193 | .label-info 194 | } 195 | .deployment-status-na { 196 | } 197 | 198 | .container-details-table th { 199 | background-color: lighten(@spring-brown, 3%); 200 | color: @spring-light-grey; 201 | } 202 | 203 | .status-help-content-table td { 204 | color: @spring-brown; 205 | } 206 | 207 | .alert-success { 208 | .alert-variant(fade(@alert-success-bg, 70%); @alert-success-border; @alert-success-text); 209 | } 210 | .alert-info { 211 | .alert-variant(fade(@alert-info-bg, 70%); @alert-info-border; @alert-info-text); 212 | } 213 | .alert-warning { 214 | .alert-variant(fade(@alert-warning-bg, 70%); @alert-warning-border; @alert-warning-text); 215 | } 216 | .alert-danger { 217 | .alert-variant(fade(@alert-danger-bg, 70%); @alert-danger-border; @alert-danger-text); 218 | } 219 | 220 | .myspinner { 221 | animation-name: spinner; 222 | animation-duration: 2s; 223 | animation-iteration-count: infinite; 224 | animation-timing-function: linear; 225 | 226 | -webkit-transform-origin: 49% 50%; 227 | -webkit-animation-name: spinner; 228 | -webkit-animation-duration: 2s; 229 | -webkit-animation-iteration-count: infinite; 230 | -webkit-animation-timing-function: linear; 231 | } 232 | 233 | hr { 234 | border-top: 1px dotted @spring-brown; 235 | } 236 | 237 | @import "typography.less"; 238 | @import "header.less"; 239 | @import "responsive.less"; 240 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/less/responsive.less: -------------------------------------------------------------------------------- 1 | @media (max-width: 768px) { 2 | .navbar-toggle { 3 | position:absolute; 4 | z-index: 9999; 5 | left:0px; 6 | top:0px; 7 | } 8 | 9 | .navbar a.navbar-brand { 10 | display: block; 11 | margin: 0 auto 0 auto; 12 | width: 148px; 13 | height: 50px; 14 | float: none; 15 | background: url("../images/spring-logo-dataflow-mobile.png") 0 center no-repeat; 16 | } 17 | 18 | .homepage-billboard .homepage-subtitle { 19 | font-size: 21px; 20 | line-height: 21px; 21 | } 22 | 23 | .navbar a.navbar-brand span { 24 | display: none; 25 | } 26 | 27 | .navbar { 28 | border-top-width: 0; 29 | } 30 | 31 | .xd-container { 32 | margin-top: 20px; 33 | margin-bottom: 30px; 34 | } 35 | 36 | .index-page--subtitle { 37 | margin-top: 10px; 38 | margin-bottom: 30px; 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/less/typography.less: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'varela_roundregular'; 3 | 4 | src: url('../fonts/varela_round-webfont.eot'); 5 | src: url('../fonts/varela_round-webfont.eot?#iefix') format('embedded-opentype'), 6 | url('../fonts/varela_round-webfont.woff') format('woff'), 7 | url('../fonts/varela_round-webfont.ttf') format('truetype'), 8 | url('../fonts/varela_round-webfont.svg#varela_roundregular') format('svg'); 9 | font-weight: normal; 10 | font-style: normal; 11 | } 12 | 13 | @font-face { 14 | font-family: 'montserratregular'; 15 | src: url('../fonts/montserrat-webfont.eot'); 16 | src: url('../fonts/montserrat-webfont.eot?#iefix') format('embedded-opentype'), 17 | url('../fonts/montserrat-webfont.woff') format('woff'), 18 | url('../fonts/montserrat-webfont.ttf') format('truetype'), 19 | url('../fonts/montserrat-webfont.svg#montserratregular') format('svg'); 20 | font-weight: normal; 21 | font-style: normal; 22 | } 23 | 24 | body, h1, h2, h3, p, input { 25 | margin: 0; 26 | font-weight: 400; 27 | font-family: "varela_roundregular", sans-serif; 28 | color: #34302d; 29 | } 30 | 31 | h1 { 32 | font-size: 24px; 33 | line-height: 30px; 34 | font-family: "montserratregular", sans-serif; 35 | } 36 | 37 | h2 { 38 | font-size: 18px; 39 | font-weight: 700; 40 | line-height: 24px; 41 | margin-bottom: 10px; 42 | font-family: "montserratregular", sans-serif; 43 | } 44 | 45 | h3 { 46 | font-size: 16px; 47 | line-height: 24px; 48 | margin-bottom: 10px; 49 | font-weight: 700; 50 | } 51 | 52 | p { 53 | //font-size: 15px; 54 | //line-height: 24px; 55 | } 56 | 57 | strong { 58 | font-weight: 700; 59 | font-family: "montserratregular", sans-serif; 60 | } 61 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/application-mysql.properties: -------------------------------------------------------------------------------- 1 | # database init, supports mysql too 2 | database=mysql 3 | spring.datasource.url=jdbc:mysql://localhost/petclinic 4 | spring.datasource.username=root 5 | spring.datasource.password=petclinic 6 | # Uncomment this the first time the app runs 7 | # spring.datasource.initialization-mode=always 8 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | # database init, supports mysql too 2 | database=hsqldb 3 | spring.datasource.schema=classpath*:db/${database}/schema.sql 4 | spring.datasource.data=classpath*:db/${database}/data.sql 5 | 6 | # Web 7 | spring.thymeleaf.mode=HTML 8 | 9 | # JPA 10 | spring.jpa.hibernate.ddl-auto=none 11 | 12 | # Internationalization 13 | spring.messages.basename=messages/messages 14 | 15 | # Actuator / Management 16 | management.endpoints.web.base-path=/manage 17 | management.endpoints.web.exposure.include=* 18 | 19 | # Logging 20 | logging.level.org.springframework=INFO 21 | # logging.level.org.springframework.web=DEBUG 22 | # logging.level.org.springframework.context.annotation=TRACE 23 | 24 | # Maximum time static resources should be cached 25 | spring.resources.cache.cachecontrol.max-age=12h 26 | 27 | server.tomcat.max-threads=4 -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/banner.txt: -------------------------------------------------------------------------------- 1 | 2 | 3 | |\ _,,,--,,_ 4 | /,`.-'`' ._ \-;;,_ 5 | _______ __|,4- ) )_ .;.(__`'-'__ ___ __ _ ___ _______ 6 | | | '---''(_/._)-'(_\_) | | | | | | | | | 7 | | _ | ___|_ _| | | | | |_| | | | __ _ _ 8 | | |_| | |___ | | | | | | | | | | \ \ \ \ 9 | | ___| ___| | | | _| |___| | _ | | _| \ \ \ \ 10 | | | | |___ | | | |_| | | | | | | |_ ) ) ) ) 11 | |___| |_______| |___| |_______|_______|___|_| |__|___|_______| / / / / 12 | ==================================================================/_/_/_/ 13 | 14 | :: Built with Spring Boot :: ${spring-boot.version} 15 | 16 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/db/hsqldb/data.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO vets VALUES (1, 'James', 'Carter'); 2 | INSERT INTO vets VALUES (2, 'Helen', 'Leary'); 3 | INSERT INTO vets VALUES (3, 'Linda', 'Douglas'); 4 | INSERT INTO vets VALUES (4, 'Rafael', 'Ortega'); 5 | INSERT INTO vets VALUES (5, 'Henry', 'Stevens'); 6 | INSERT INTO vets VALUES (6, 'Sharon', 'Jenkins'); 7 | 8 | INSERT INTO specialties VALUES (1, 'radiology'); 9 | INSERT INTO specialties VALUES (2, 'surgery'); 10 | INSERT INTO specialties VALUES (3, 'dentistry'); 11 | 12 | INSERT INTO vet_specialties VALUES (2, 1); 13 | INSERT INTO vet_specialties VALUES (3, 2); 14 | INSERT INTO vet_specialties VALUES (3, 3); 15 | INSERT INTO vet_specialties VALUES (4, 2); 16 | INSERT INTO vet_specialties VALUES (5, 1); 17 | 18 | INSERT INTO types VALUES (1, 'cat'); 19 | INSERT INTO types VALUES (2, 'dog'); 20 | INSERT INTO types VALUES (3, 'lizard'); 21 | INSERT INTO types VALUES (4, 'snake'); 22 | INSERT INTO types VALUES (5, 'bird'); 23 | INSERT INTO types VALUES (6, 'hamster'); 24 | 25 | INSERT INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023'); 26 | INSERT INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749'); 27 | INSERT INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763'); 28 | INSERT INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198'); 29 | INSERT INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765'); 30 | INSERT INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654'); 31 | INSERT INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387'); 32 | INSERT INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683'); 33 | INSERT INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); 34 | INSERT INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); 35 | 36 | INSERT INTO pets VALUES (1, 'Leo', '2010-09-07', 1, 1); 37 | INSERT INTO pets VALUES (2, 'Basil', '2012-08-06', 6, 2); 38 | INSERT INTO pets VALUES (3, 'Rosy', '2011-04-17', 2, 3); 39 | INSERT INTO pets VALUES (4, 'Jewel', '2010-03-07', 2, 3); 40 | INSERT INTO pets VALUES (5, 'Iggy', '2010-11-30', 3, 4); 41 | INSERT INTO pets VALUES (6, 'George', '2010-01-20', 4, 5); 42 | INSERT INTO pets VALUES (7, 'Samantha', '2012-09-04', 1, 6); 43 | INSERT INTO pets VALUES (8, 'Max', '2012-09-04', 1, 6); 44 | INSERT INTO pets VALUES (9, 'Lucky', '2011-08-06', 5, 7); 45 | INSERT INTO pets VALUES (10, 'Mulligan', '2007-02-24', 2, 8); 46 | INSERT INTO pets VALUES (11, 'Freddy', '2010-03-09', 5, 9); 47 | INSERT INTO pets VALUES (12, 'Lucky', '2010-06-24', 2, 10); 48 | INSERT INTO pets VALUES (13, 'Sly', '2012-06-08', 1, 10); 49 | 50 | INSERT INTO visits VALUES (1, 7, '2013-01-01', 'rabies shot'); 51 | INSERT INTO visits VALUES (2, 8, '2013-01-02', 'rabies shot'); 52 | INSERT INTO visits VALUES (3, 8, '2013-01-03', 'neutered'); 53 | INSERT INTO visits VALUES (4, 7, '2013-01-04', 'spayed'); 54 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/db/hsqldb/schema.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE vet_specialties IF EXISTS; 2 | DROP TABLE vets IF EXISTS; 3 | DROP TABLE specialties IF EXISTS; 4 | DROP TABLE visits IF EXISTS; 5 | DROP TABLE pets IF EXISTS; 6 | DROP TABLE types IF EXISTS; 7 | DROP TABLE owners IF EXISTS; 8 | 9 | 10 | CREATE TABLE vets ( 11 | id INTEGER IDENTITY PRIMARY KEY, 12 | first_name VARCHAR(30), 13 | last_name VARCHAR(30) 14 | ); 15 | CREATE INDEX vets_last_name ON vets (last_name); 16 | 17 | CREATE TABLE specialties ( 18 | id INTEGER IDENTITY PRIMARY KEY, 19 | name VARCHAR(80) 20 | ); 21 | CREATE INDEX specialties_name ON specialties (name); 22 | 23 | CREATE TABLE vet_specialties ( 24 | vet_id INTEGER NOT NULL, 25 | specialty_id INTEGER NOT NULL 26 | ); 27 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_vets FOREIGN KEY (vet_id) REFERENCES vets (id); 28 | ALTER TABLE vet_specialties ADD CONSTRAINT fk_vet_specialties_specialties FOREIGN KEY (specialty_id) REFERENCES specialties (id); 29 | 30 | CREATE TABLE types ( 31 | id INTEGER IDENTITY PRIMARY KEY, 32 | name VARCHAR(80) 33 | ); 34 | CREATE INDEX types_name ON types (name); 35 | 36 | CREATE TABLE owners ( 37 | id INTEGER IDENTITY PRIMARY KEY, 38 | first_name VARCHAR(30), 39 | last_name VARCHAR_IGNORECASE(30), 40 | address VARCHAR(255), 41 | city VARCHAR(80), 42 | telephone VARCHAR(20) 43 | ); 44 | CREATE INDEX owners_last_name ON owners (last_name); 45 | 46 | CREATE TABLE pets ( 47 | id INTEGER IDENTITY PRIMARY KEY, 48 | name VARCHAR(30), 49 | birth_date DATE, 50 | type_id INTEGER NOT NULL, 51 | owner_id INTEGER NOT NULL 52 | ); 53 | ALTER TABLE pets ADD CONSTRAINT fk_pets_owners FOREIGN KEY (owner_id) REFERENCES owners (id); 54 | ALTER TABLE pets ADD CONSTRAINT fk_pets_types FOREIGN KEY (type_id) REFERENCES types (id); 55 | CREATE INDEX pets_name ON pets (name); 56 | 57 | CREATE TABLE visits ( 58 | id INTEGER IDENTITY PRIMARY KEY, 59 | pet_id INTEGER NOT NULL, 60 | visit_date DATE, 61 | description VARCHAR(255) 62 | ); 63 | ALTER TABLE visits ADD CONSTRAINT fk_visits_pets FOREIGN KEY (pet_id) REFERENCES pets (id); 64 | CREATE INDEX visits_pet_id ON visits (pet_id); 65 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/db/mysql/data.sql: -------------------------------------------------------------------------------- 1 | INSERT IGNORE INTO vets VALUES (1, 'James', 'Carter'); 2 | INSERT IGNORE INTO vets VALUES (2, 'Helen', 'Leary'); 3 | INSERT IGNORE INTO vets VALUES (3, 'Linda', 'Douglas'); 4 | INSERT IGNORE INTO vets VALUES (4, 'Rafael', 'Ortega'); 5 | INSERT IGNORE INTO vets VALUES (5, 'Henry', 'Stevens'); 6 | INSERT IGNORE INTO vets VALUES (6, 'Sharon', 'Jenkins'); 7 | 8 | INSERT IGNORE INTO specialties VALUES (1, 'radiology'); 9 | INSERT IGNORE INTO specialties VALUES (2, 'surgery'); 10 | INSERT IGNORE INTO specialties VALUES (3, 'dentistry'); 11 | 12 | INSERT IGNORE INTO vet_specialties VALUES (2, 1); 13 | INSERT IGNORE INTO vet_specialties VALUES (3, 2); 14 | INSERT IGNORE INTO vet_specialties VALUES (3, 3); 15 | INSERT IGNORE INTO vet_specialties VALUES (4, 2); 16 | INSERT IGNORE INTO vet_specialties VALUES (5, 1); 17 | 18 | INSERT IGNORE INTO types VALUES (1, 'cat'); 19 | INSERT IGNORE INTO types VALUES (2, 'dog'); 20 | INSERT IGNORE INTO types VALUES (3, 'lizard'); 21 | INSERT IGNORE INTO types VALUES (4, 'snake'); 22 | INSERT IGNORE INTO types VALUES (5, 'bird'); 23 | INSERT IGNORE INTO types VALUES (6, 'hamster'); 24 | 25 | INSERT IGNORE INTO owners VALUES (1, 'George', 'Franklin', '110 W. Liberty St.', 'Madison', '6085551023'); 26 | INSERT IGNORE INTO owners VALUES (2, 'Betty', 'Davis', '638 Cardinal Ave.', 'Sun Prairie', '6085551749'); 27 | INSERT IGNORE INTO owners VALUES (3, 'Eduardo', 'Rodriquez', '2693 Commerce St.', 'McFarland', '6085558763'); 28 | INSERT IGNORE INTO owners VALUES (4, 'Harold', 'Davis', '563 Friendly St.', 'Windsor', '6085553198'); 29 | INSERT IGNORE INTO owners VALUES (5, 'Peter', 'McTavish', '2387 S. Fair Way', 'Madison', '6085552765'); 30 | INSERT IGNORE INTO owners VALUES (6, 'Jean', 'Coleman', '105 N. Lake St.', 'Monona', '6085552654'); 31 | INSERT IGNORE INTO owners VALUES (7, 'Jeff', 'Black', '1450 Oak Blvd.', 'Monona', '6085555387'); 32 | INSERT IGNORE INTO owners VALUES (8, 'Maria', 'Escobito', '345 Maple St.', 'Madison', '6085557683'); 33 | INSERT IGNORE INTO owners VALUES (9, 'David', 'Schroeder', '2749 Blackhawk Trail', 'Madison', '6085559435'); 34 | INSERT IGNORE INTO owners VALUES (10, 'Carlos', 'Estaban', '2335 Independence La.', 'Waunakee', '6085555487'); 35 | 36 | INSERT IGNORE INTO pets VALUES (1, 'Leo', '2000-09-07', 1, 1); 37 | INSERT IGNORE INTO pets VALUES (2, 'Basil', '2002-08-06', 6, 2); 38 | INSERT IGNORE INTO pets VALUES (3, 'Rosy', '2001-04-17', 2, 3); 39 | INSERT IGNORE INTO pets VALUES (4, 'Jewel', '2000-03-07', 2, 3); 40 | INSERT IGNORE INTO pets VALUES (5, 'Iggy', '2000-11-30', 3, 4); 41 | INSERT IGNORE INTO pets VALUES (6, 'George', '2000-01-20', 4, 5); 42 | INSERT IGNORE INTO pets VALUES (7, 'Samantha', '1995-09-04', 1, 6); 43 | INSERT IGNORE INTO pets VALUES (8, 'Max', '1995-09-04', 1, 6); 44 | INSERT IGNORE INTO pets VALUES (9, 'Lucky', '1999-08-06', 5, 7); 45 | INSERT IGNORE INTO pets VALUES (10, 'Mulligan', '1997-02-24', 2, 8); 46 | INSERT IGNORE INTO pets VALUES (11, 'Freddy', '2000-03-09', 5, 9); 47 | INSERT IGNORE INTO pets VALUES (12, 'Lucky', '2000-06-24', 2, 10); 48 | INSERT IGNORE INTO pets VALUES (13, 'Sly', '2002-06-08', 1, 10); 49 | 50 | INSERT IGNORE INTO visits VALUES (1, 7, '2010-03-04', 'rabies shot'); 51 | INSERT IGNORE INTO visits VALUES (2, 8, '2011-03-04', 'rabies shot'); 52 | INSERT IGNORE INTO visits VALUES (3, 8, '2009-06-04', 'neutered'); 53 | INSERT IGNORE INTO visits VALUES (4, 7, '2008-09-04', 'spayed'); 54 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/db/mysql/petclinic_db_setup_mysql.txt: -------------------------------------------------------------------------------- 1 | ================================================================================ 2 | === Spring PetClinic sample application - MySQL Configuration === 3 | ================================================================================ 4 | 5 | @author Sam Brannen 6 | @author Costin Leau 7 | @author Dave Syer 8 | 9 | -------------------------------------------------------------------------------- 10 | 11 | 1) Download and install the MySQL database (e.g., MySQL Community Server 5.1.x), 12 | which can be found here: http://dev.mysql.com/downloads/. Or run the 13 | "docker-compose.yml" from the root of the project (if you have docker installed 14 | locally). 15 | 16 | 2) Create the PetClinic database and user by executing the "db/mysql/{schema,data}.sql" 17 | scripts (or set "spring.datasource.initialize=true" the first time you run the app). 18 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/db/mysql/schema.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE IF NOT EXISTS petclinic; 2 | 3 | ALTER DATABASE petclinic 4 | DEFAULT CHARACTER SET utf8 5 | DEFAULT COLLATE utf8_general_ci; 6 | 7 | GRANT ALL PRIVILEGES ON petclinic.* TO pc@localhost IDENTIFIED BY 'pc'; 8 | 9 | USE petclinic; 10 | 11 | CREATE TABLE IF NOT EXISTS vets ( 12 | id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 13 | first_name VARCHAR(30), 14 | last_name VARCHAR(30), 15 | INDEX(last_name) 16 | ) engine=InnoDB; 17 | 18 | CREATE TABLE IF NOT EXISTS specialties ( 19 | id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 20 | name VARCHAR(80), 21 | INDEX(name) 22 | ) engine=InnoDB; 23 | 24 | CREATE TABLE IF NOT EXISTS vet_specialties ( 25 | vet_id INT(4) UNSIGNED NOT NULL, 26 | specialty_id INT(4) UNSIGNED NOT NULL, 27 | FOREIGN KEY (vet_id) REFERENCES vets(id), 28 | FOREIGN KEY (specialty_id) REFERENCES specialties(id), 29 | UNIQUE (vet_id,specialty_id) 30 | ) engine=InnoDB; 31 | 32 | CREATE TABLE IF NOT EXISTS types ( 33 | id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 34 | name VARCHAR(80), 35 | INDEX(name) 36 | ) engine=InnoDB; 37 | 38 | CREATE TABLE IF NOT EXISTS owners ( 39 | id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 40 | first_name VARCHAR(30), 41 | last_name VARCHAR(30), 42 | address VARCHAR(255), 43 | city VARCHAR(80), 44 | telephone VARCHAR(20), 45 | INDEX(last_name) 46 | ) engine=InnoDB; 47 | 48 | CREATE TABLE IF NOT EXISTS pets ( 49 | id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 50 | name VARCHAR(30), 51 | birth_date DATE, 52 | type_id INT(4) UNSIGNED NOT NULL, 53 | owner_id INT(4) UNSIGNED NOT NULL, 54 | INDEX(name), 55 | FOREIGN KEY (owner_id) REFERENCES owners(id), 56 | FOREIGN KEY (type_id) REFERENCES types(id) 57 | ) engine=InnoDB; 58 | 59 | CREATE TABLE IF NOT EXISTS visits ( 60 | id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 61 | pet_id INT(4) UNSIGNED NOT NULL, 62 | visit_date DATE, 63 | description VARCHAR(255), 64 | FOREIGN KEY (pet_id) REFERENCES pets(id) 65 | ) engine=InnoDB; 66 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/messages/messages.properties: -------------------------------------------------------------------------------- 1 | welcome=Welcome 2 | required=is required 3 | notFound=has not been found 4 | duplicate=is already in use 5 | nonNumeric=must be all numeric 6 | duplicateFormSubmission=Duplicate form submission is not allowed 7 | typeMismatch.date=invalid date 8 | typeMismatch.birthDate=invalid date 9 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/messages/messages_de.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/messages/messages_de.properties -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/messages/messages_en.properties: -------------------------------------------------------------------------------- 1 | # This file is intentionally empty. Message look-ups will fall back to the default "messages.properties" file. -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/fonts/montserrat-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/fonts/montserrat-webfont.eot -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/fonts/montserrat-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/fonts/montserrat-webfont.ttf -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/fonts/montserrat-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/fonts/montserrat-webfont.woff -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/fonts/varela_round-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/fonts/varela_round-webfont.eot -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/fonts/varela_round-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/fonts/varela_round-webfont.ttf -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/fonts/varela_round-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/fonts/varela_round-webfont.woff -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/images/favicon.png -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/images/pets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/images/pets.png -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/images/platform-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/images/platform-bg.png -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/images/spring-logo-dataflow-mobile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/images/spring-logo-dataflow-mobile.png -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/images/spring-logo-dataflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/images/spring-logo-dataflow.png -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/static/resources/images/spring-pivotal-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dsyer/spring-boot-auto-reflect/a1957ae0b58ba3c42dcbf2966f00516145a96e3c/samples/petclinic/src/main/resources/static/resources/images/spring-pivotal-logo.png -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/error.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Something happened...

8 |

Exception message

9 | 10 | 11 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/fragments/inputField.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
8 | 9 |
10 |
11 | 12 | 15 |
16 | 19 | 20 | 23 | Error 24 | 25 |
26 |
27 |
28 |
29 | 30 | 31 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/fragments/layout.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | PetClinic :: a Spring Framework demonstration 14 | 15 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 71 |
72 |
73 | 74 | 75 | 76 |
77 |
78 |
79 |
80 |
81 | Sponsored by Pivotal
83 |
84 |
85 |
86 |
87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/fragments/selectField.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 5 |
8 | 9 | 10 |
11 | 15 | 18 | 19 | 22 | Error 23 | 24 |
25 |
26 |
27 |
28 | 29 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/owners/createOrUpdateOwnerForm.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 |

Owner

7 |
8 |
9 | 11 | 13 | 15 | 17 | 19 |
20 |
21 |
22 | 26 |
27 |
28 |
29 | 30 | 31 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/owners/findOwners.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 |

Find Owners

7 | 8 |
10 |
11 |
12 | 13 |
14 |
17 |

Error

18 |
19 |
20 |
21 |
22 |
23 |
24 | 26 |
27 |
28 | 29 |
30 | 31 |
32 | Add Owner 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/owners/ownerDetails.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 | 9 |

Owner Information

10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
Name
Address
City
Telephone
30 | 31 | Edit 32 | Owner 33 | Add 34 | New Pet 35 | 36 |
37 |
38 |
39 |

Pets and Visits

40 | 41 | 42 | 43 | 44 | 55 | 77 | 78 | 79 |
45 |
46 |
Name
47 |
48 |
Birth Date
49 |
51 |
Type
52 |
53 |
54 |
56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 71 | 74 | 75 |
Visit DateDescription
Edit 70 | PetAdd 73 | Visit
76 |
80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/owners/ownersList.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Owners

8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 24 | 28 | 29 | 30 |
NameAddressCityTelephonePets
22 | 23 | 25 | 26 | 27 |
31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/pets/createOrUpdatePetForm.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 |

7 | New 8 | Pet 9 |

10 |
11 | 12 |
13 |
14 | 15 |
16 | 17 |
18 |
19 | 21 | 23 | 25 |
26 |
27 |
28 | 32 |
33 |
34 |
35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/pets/createOrUpdateVisitForm.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 |

7 | New 8 | Visit 9 |

10 | 11 | Pet 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 25 | 26 | 28 | 29 |
NameBirth DateTypeOwner
30 | 31 |
32 |
33 | 35 | 37 |
38 | 39 |
40 |
41 | 42 | 43 |
44 |
45 |
46 | 47 |
48 | Previous Visits 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 |
DateDescription
59 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/vets/vetList.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 6 | 7 | 8 |

Veterinarians

9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 23 | 24 | 25 |
NameSpecialties
none
26 | 27 | 28 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/resources/templates/welcome.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 |

Welcome

8 |
9 |
10 | 11 |
12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /samples/petclinic/src/main/wro/wro.properties: -------------------------------------------------------------------------------- 1 | #List of preProcessors 2 | preProcessors=lessCssImport 3 | #List of postProcessors 4 | postProcessors=less4j -------------------------------------------------------------------------------- /samples/petclinic/src/main/wro/wro.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | classpath:META-INF/resources/webjars/bootstrap/3.3.6/less/bootstrap.less 4 | /petclinic.less 5 | 6 | 7 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/PetclinicIntegrationTests.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2012-2018 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.springframework.samples.petclinic; 18 | 19 | import org.junit.Test; 20 | import org.junit.runner.RunWith; 21 | 22 | import org.springframework.beans.factory.annotation.Autowired; 23 | import org.springframework.boot.reflect.AutoTestContextLoader; 24 | import org.springframework.boot.test.context.SpringBootTest; 25 | import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; 26 | import org.springframework.samples.petclinic.vet.VetRepository; 27 | import org.springframework.test.context.ContextConfiguration; 28 | import org.springframework.test.context.junit4.SpringRunner; 29 | 30 | @RunWith(SpringRunner.class) 31 | @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) 32 | @ContextConfiguration(classes = PetClinicApplication.class, loader = AutoTestContextLoader.class) 33 | public class PetclinicIntegrationTests { 34 | 35 | @Autowired 36 | private VetRepository vets; 37 | 38 | @Test 39 | public void testFindAll() throws Exception { 40 | vets.findAll(); 41 | vets.findAll(); // served from cache 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/model/ValidatorTests.java: -------------------------------------------------------------------------------- 1 | package org.springframework.samples.petclinic.model; 2 | 3 | import java.util.Locale; 4 | import java.util.Set; 5 | 6 | import javax.validation.ConstraintViolation; 7 | import javax.validation.Validator; 8 | 9 | import org.junit.Test; 10 | 11 | import org.springframework.context.i18n.LocaleContextHolder; 12 | import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean; 13 | 14 | import static org.assertj.core.api.Assertions.assertThat; 15 | 16 | /** 17 | * @author Michael Isvy Simple test to make sure that Bean Validation is working (useful 18 | * when upgrading to a new version of Hibernate Validator/ Bean Validation) 19 | */ 20 | public class ValidatorTests { 21 | 22 | private Validator createValidator() { 23 | LocalValidatorFactoryBean localValidatorFactoryBean = new LocalValidatorFactoryBean(); 24 | localValidatorFactoryBean.afterPropertiesSet(); 25 | return localValidatorFactoryBean; 26 | } 27 | 28 | @Test 29 | public void shouldNotValidateWhenFirstNameEmpty() { 30 | 31 | LocaleContextHolder.setLocale(Locale.ENGLISH); 32 | Person person = new Person(); 33 | person.setFirstName(""); 34 | person.setLastName("smith"); 35 | 36 | Validator validator = createValidator(); 37 | Set> constraintViolations = validator 38 | .validate(person); 39 | 40 | assertThat(constraintViolations.size()).isEqualTo(1); 41 | ConstraintViolation violation = constraintViolations.iterator().next(); 42 | assertThat(violation.getPropertyPath().toString()).isEqualTo("firstName"); 43 | assertThat(violation.getMessage()).isEqualTo("must not be empty"); 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/owner/PetControllerTests.java: -------------------------------------------------------------------------------- 1 | package org.springframework.samples.petclinic.owner; 2 | 3 | import org.assertj.core.util.Lists; 4 | import org.junit.Before; 5 | import org.junit.Ignore; 6 | import org.junit.Test; 7 | import org.junit.runner.RunWith; 8 | 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 11 | import org.springframework.boot.test.mock.mockito.MockBean; 12 | import org.springframework.context.annotation.ComponentScan; 13 | import org.springframework.context.annotation.FilterType; 14 | import org.springframework.test.context.junit4.SpringRunner; 15 | import org.springframework.test.web.servlet.MockMvc; 16 | 17 | import static org.mockito.BDDMockito.given; 18 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 19 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 20 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; 21 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 22 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; 23 | 24 | /** 25 | * Test class for the {@link PetController} 26 | * 27 | * @author Colin But 28 | */ 29 | @RunWith(SpringRunner.class) 30 | @WebMvcTest(value = PetController.class, includeFilters = @ComponentScan.Filter(value = PetTypeFormatter.class, type = FilterType.ASSIGNABLE_TYPE)) 31 | @Ignore("No support for @WebMvcTest yet") 32 | public class PetControllerTests { 33 | 34 | private static final int TEST_OWNER_ID = 1; 35 | private static final int TEST_PET_ID = 1; 36 | 37 | @Autowired 38 | private MockMvc mockMvc; 39 | 40 | @MockBean 41 | private PetRepository pets; 42 | 43 | @MockBean 44 | private OwnerRepository owners; 45 | 46 | @Before 47 | public void setup() { 48 | PetType cat = new PetType(); 49 | cat.setId(3); 50 | cat.setName("hamster"); 51 | given(this.pets.findPetTypes()).willReturn(Lists.newArrayList(cat)); 52 | given(this.owners.findById(TEST_OWNER_ID)).willReturn(new Owner()); 53 | given(this.pets.findById(TEST_PET_ID)).willReturn(new Pet()); 54 | 55 | } 56 | 57 | @Test 58 | public void testInitCreationForm() throws Exception { 59 | mockMvc.perform(get("/owners/{ownerId}/pets/new", TEST_OWNER_ID)) 60 | .andExpect(status().isOk()) 61 | .andExpect(view().name("pets/createOrUpdatePetForm")) 62 | .andExpect(model().attributeExists("pet")); 63 | } 64 | 65 | @Test 66 | public void testProcessCreationFormSuccess() throws Exception { 67 | mockMvc.perform( 68 | post("/owners/{ownerId}/pets/new", TEST_OWNER_ID).param("name", "Betty") 69 | .param("type", "hamster").param("birthDate", "2015-02-12")) 70 | .andExpect(status().is3xxRedirection()) 71 | .andExpect(view().name("redirect:/owners/{ownerId}")); 72 | } 73 | 74 | @Test 75 | public void testProcessCreationFormHasErrors() throws Exception { 76 | mockMvc.perform(post("/owners/{ownerId}/pets/new", TEST_OWNER_ID) 77 | .param("name", "Betty").param("birthDate", "2015-02-12")) 78 | .andExpect(model().attributeHasNoErrors("owner")) 79 | .andExpect(model().attributeHasErrors("pet")) 80 | .andExpect(model().attributeHasFieldErrors("pet", "type")) 81 | .andExpect(model().attributeHasFieldErrorCode("pet", "type", "required")) 82 | .andExpect(status().isOk()) 83 | .andExpect(view().name("pets/createOrUpdatePetForm")); 84 | } 85 | 86 | @Test 87 | public void testInitUpdateForm() throws Exception { 88 | mockMvc.perform( 89 | get("/owners/{ownerId}/pets/{petId}/edit", TEST_OWNER_ID, TEST_PET_ID)) 90 | .andExpect(status().isOk()).andExpect(model().attributeExists("pet")) 91 | .andExpect(view().name("pets/createOrUpdatePetForm")); 92 | } 93 | 94 | @Test 95 | public void testProcessUpdateFormSuccess() throws Exception { 96 | mockMvc.perform( 97 | post("/owners/{ownerId}/pets/{petId}/edit", TEST_OWNER_ID, TEST_PET_ID) 98 | .param("name", "Betty").param("type", "hamster") 99 | .param("birthDate", "2015-02-12")) 100 | .andExpect(status().is3xxRedirection()) 101 | .andExpect(view().name("redirect:/owners/{ownerId}")); 102 | } 103 | 104 | @Test 105 | public void testProcessUpdateFormHasErrors() throws Exception { 106 | mockMvc.perform( 107 | post("/owners/{ownerId}/pets/{petId}/edit", TEST_OWNER_ID, TEST_PET_ID) 108 | .param("name", "Betty").param("birthDate", "2015/02/12")) 109 | .andExpect(model().attributeHasNoErrors("owner")) 110 | .andExpect(model().attributeHasErrors("pet")).andExpect(status().isOk()) 111 | .andExpect(view().name("pets/createOrUpdatePetForm")); 112 | } 113 | 114 | } 115 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/owner/PetTypeFormatterTests.java: -------------------------------------------------------------------------------- 1 | package org.springframework.samples.petclinic.owner; 2 | 3 | import java.text.ParseException; 4 | import java.util.ArrayList; 5 | import java.util.Collection; 6 | import java.util.List; 7 | import java.util.Locale; 8 | 9 | import org.junit.Before; 10 | import org.junit.Test; 11 | import org.junit.runner.RunWith; 12 | import org.mockito.Mock; 13 | import org.mockito.Mockito; 14 | import org.mockito.junit.MockitoJUnitRunner; 15 | 16 | import static org.junit.Assert.assertEquals; 17 | 18 | /** 19 | * Test class for {@link PetTypeFormatter} 20 | * 21 | * @author Colin But 22 | */ 23 | @RunWith(MockitoJUnitRunner.class) 24 | public class PetTypeFormatterTests { 25 | 26 | @Mock 27 | private PetRepository pets; 28 | 29 | private PetTypeFormatter petTypeFormatter; 30 | 31 | @Before 32 | public void setup() { 33 | this.petTypeFormatter = new PetTypeFormatter(pets); 34 | } 35 | 36 | @Test 37 | public void testPrint() { 38 | PetType petType = new PetType(); 39 | petType.setName("Hamster"); 40 | String petTypeName = this.petTypeFormatter.print(petType, Locale.ENGLISH); 41 | assertEquals("Hamster", petTypeName); 42 | } 43 | 44 | @Test 45 | public void shouldParse() throws ParseException { 46 | Mockito.when(this.pets.findPetTypes()).thenReturn(makePetTypes()); 47 | PetType petType = petTypeFormatter.parse("Bird", Locale.ENGLISH); 48 | assertEquals("Bird", petType.getName()); 49 | } 50 | 51 | @Test(expected = ParseException.class) 52 | public void shouldThrowParseException() throws ParseException { 53 | Mockito.when(this.pets.findPetTypes()).thenReturn(makePetTypes()); 54 | petTypeFormatter.parse("Fish", Locale.ENGLISH); 55 | } 56 | 57 | /** 58 | * Helper method to produce some sample pet types just for test purpose 59 | * 60 | * @return {@link Collection} of {@link PetType} 61 | */ 62 | private List makePetTypes() { 63 | List petTypes = new ArrayList<>(); 64 | petTypes.add(new PetType() { 65 | { 66 | setName("Dog"); 67 | } 68 | }); 69 | petTypes.add(new PetType() { 70 | { 71 | setName("Bird"); 72 | } 73 | }); 74 | return petTypes; 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/owner/VisitControllerTests.java: -------------------------------------------------------------------------------- 1 | package org.springframework.samples.petclinic.owner; 2 | 3 | import org.junit.Before; 4 | import org.junit.Ignore; 5 | import org.junit.Test; 6 | import org.junit.runner.RunWith; 7 | 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 10 | import org.springframework.boot.test.mock.mockito.MockBean; 11 | import org.springframework.samples.petclinic.visit.VisitRepository; 12 | import org.springframework.test.context.junit4.SpringRunner; 13 | import org.springframework.test.web.servlet.MockMvc; 14 | 15 | import static org.mockito.BDDMockito.given; 16 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 17 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; 18 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; 19 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 20 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; 21 | 22 | /** 23 | * Test class for {@link VisitController} 24 | * 25 | * @author Colin But 26 | */ 27 | @RunWith(SpringRunner.class) 28 | @WebMvcTest(VisitController.class) 29 | @Ignore("No support for @WebMvcTest yet") 30 | public class VisitControllerTests { 31 | 32 | private static final int TEST_PET_ID = 1; 33 | 34 | @Autowired 35 | private MockMvc mockMvc; 36 | 37 | @MockBean 38 | private VisitRepository visits; 39 | 40 | @MockBean 41 | private PetRepository pets; 42 | 43 | @Before 44 | public void init() { 45 | given(this.pets.findById(TEST_PET_ID)).willReturn(new Pet()); 46 | } 47 | 48 | @Test 49 | public void testInitNewVisitForm() throws Exception { 50 | mockMvc.perform(get("/owners/*/pets/{petId}/visits/new", TEST_PET_ID)) 51 | .andExpect(status().isOk()) 52 | .andExpect(view().name("pets/createOrUpdateVisitForm")); 53 | } 54 | 55 | @Test 56 | public void testProcessNewVisitFormSuccess() throws Exception { 57 | mockMvc.perform(post("/owners/*/pets/{petId}/visits/new", TEST_PET_ID) 58 | .param("name", "George").param("description", "Visit Description")) 59 | .andExpect(status().is3xxRedirection()) 60 | .andExpect(view().name("redirect:/owners/{ownerId}")); 61 | } 62 | 63 | @Test 64 | public void testProcessNewVisitFormHasErrors() throws Exception { 65 | mockMvc.perform(post("/owners/*/pets/{petId}/visits/new", TEST_PET_ID) 66 | .param("name", "George")).andExpect(model().attributeHasErrors("visit")) 67 | .andExpect(status().isOk()) 68 | .andExpect(view().name("pets/createOrUpdateVisitForm")); 69 | } 70 | 71 | } 72 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/service/EntityUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2002-2013 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | 17 | package org.springframework.samples.petclinic.service; 18 | 19 | import java.util.Collection; 20 | 21 | import org.springframework.orm.ObjectRetrievalFailureException; 22 | import org.springframework.samples.petclinic.model.BaseEntity; 23 | 24 | /** 25 | * Utility methods for handling entities. Separate from the BaseEntity class mainly because of dependency on the 26 | * ORM-associated ObjectRetrievalFailureException. 27 | * 28 | * @author Juergen Hoeller 29 | * @author Sam Brannen 30 | * @see org.springframework.samples.petclinic.model.BaseEntity 31 | * @since 29.10.2003 32 | */ 33 | public abstract class EntityUtils { 34 | 35 | /** 36 | * Look up the entity of the given class with the given id in the given collection. 37 | * 38 | * @param entities the collection to search 39 | * @param entityClass the entity class to look up 40 | * @param entityId the entity id to look up 41 | * @return the found entity 42 | * @throws ObjectRetrievalFailureException if the entity was not found 43 | */ 44 | public static T getById(Collection entities, Class entityClass, int entityId) 45 | throws ObjectRetrievalFailureException { 46 | for (T entity : entities) { 47 | if (entity.getId() == entityId && entityClass.isInstance(entity)) { 48 | return entity; 49 | } 50 | } 51 | throw new ObjectRetrievalFailureException(entityClass, entityId); 52 | } 53 | 54 | } 55 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/system/CrashControllerTests.java: -------------------------------------------------------------------------------- 1 | package org.springframework.samples.petclinic.system; 2 | 3 | import org.junit.Ignore; 4 | import org.junit.Test; 5 | import org.junit.runner.RunWith; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 9 | import org.springframework.test.context.junit4.SpringRunner; 10 | import org.springframework.test.web.servlet.MockMvc; 11 | 12 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 13 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.forwardedUrl; 14 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; 15 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 16 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; 17 | 18 | /** 19 | * Test class for {@link CrashController} 20 | * 21 | * @author Colin But 22 | */ 23 | @RunWith(SpringRunner.class) 24 | // Waiting https://github.com/spring-projects/spring-boot/issues/5574 25 | @Ignore 26 | @WebMvcTest(controllers = CrashController.class) 27 | public class CrashControllerTests { 28 | 29 | @Autowired 30 | private MockMvc mockMvc; 31 | 32 | @Test 33 | public void testTriggerException() throws Exception { 34 | mockMvc.perform(get("/oups")).andExpect(view().name("exception")) 35 | .andExpect(model().attributeExists("exception")) 36 | .andExpect(forwardedUrl("exception")).andExpect(status().isOk()); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/vet/VetControllerTests.java: -------------------------------------------------------------------------------- 1 | package org.springframework.samples.petclinic.vet; 2 | 3 | import org.assertj.core.util.Lists; 4 | import org.junit.Before; 5 | import org.junit.Ignore; 6 | import org.junit.Test; 7 | import org.junit.runner.RunWith; 8 | 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; 11 | import org.springframework.boot.test.mock.mockito.MockBean; 12 | import org.springframework.http.MediaType; 13 | import org.springframework.test.context.junit4.SpringRunner; 14 | import org.springframework.test.web.servlet.MockMvc; 15 | import org.springframework.test.web.servlet.ResultActions; 16 | 17 | import static org.hamcrest.xml.HasXPath.hasXPath; 18 | import static org.mockito.BDDMockito.given; 19 | import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 20 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; 21 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; 22 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.model; 23 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 24 | import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view; 25 | 26 | /** 27 | * Test class for the {@link VetController} 28 | */ 29 | @RunWith(SpringRunner.class) 30 | @WebMvcTest(VetController.class) 31 | @Ignore("No support for @WebMvcTest yet") 32 | public class VetControllerTests { 33 | 34 | @Autowired 35 | private MockMvc mockMvc; 36 | 37 | @MockBean 38 | private VetRepository vets; 39 | 40 | @Before 41 | public void setup() { 42 | Vet james = new Vet(); 43 | james.setFirstName("James"); 44 | james.setLastName("Carter"); 45 | james.setId(1); 46 | Vet helen = new Vet(); 47 | helen.setFirstName("Helen"); 48 | helen.setLastName("Leary"); 49 | helen.setId(2); 50 | Specialty radiology = new Specialty(); 51 | radiology.setId(1); 52 | radiology.setName("radiology"); 53 | helen.addSpecialty(radiology); 54 | given(this.vets.findAll()).willReturn(Lists.newArrayList(james, helen)); 55 | } 56 | 57 | @Test 58 | public void testShowVetListHtml() throws Exception { 59 | mockMvc.perform(get("/vets.html")).andExpect(status().isOk()) 60 | .andExpect(model().attributeExists("vets")) 61 | .andExpect(view().name("vets/vetList")); 62 | } 63 | 64 | @Test 65 | public void testShowResourcesVetList() throws Exception { 66 | ResultActions actions = mockMvc 67 | .perform(get("/vets").accept(MediaType.APPLICATION_JSON)) 68 | .andExpect(status().isOk()); 69 | actions.andExpect(content().contentType("application/json;charset=UTF-8")) 70 | .andExpect(jsonPath("$.vetList[0].id").value(1)); 71 | } 72 | 73 | @Test 74 | public void testShowVetListXml() throws Exception { 75 | mockMvc.perform(get("/vets").accept(MediaType.APPLICATION_XML)) 76 | .andExpect(status().isOk()) 77 | .andExpect(content().contentType(MediaType.APPLICATION_XML_VALUE)) 78 | .andExpect(content().node(hasXPath("/vets/vetList[id=1]/id"))); 79 | } 80 | 81 | } 82 | -------------------------------------------------------------------------------- /samples/petclinic/src/test/java/org/springframework/samples/petclinic/vet/VetTests.java: -------------------------------------------------------------------------------- 1 | /* 2 | * Copyright 2016-2017 the original author or authors. 3 | * 4 | * Licensed under the Apache License, Version 2.0 (the "License"); 5 | * you may not use this file except in compliance with the License. 6 | * You may obtain a copy of the License at 7 | * 8 | * http://www.apache.org/licenses/LICENSE-2.0 9 | * 10 | * Unless required by applicable law or agreed to in writing, software 11 | * distributed under the License is distributed on an "AS IS" BASIS, 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | * See the License for the specific language governing permissions and 14 | * limitations under the License. 15 | */ 16 | package org.springframework.samples.petclinic.vet; 17 | 18 | import org.junit.Test; 19 | 20 | import org.springframework.util.SerializationUtils; 21 | 22 | import static org.assertj.core.api.Assertions.assertThat; 23 | 24 | /** 25 | * @author Dave Syer 26 | * 27 | */ 28 | public class VetTests { 29 | 30 | @Test 31 | public void testSerialization() { 32 | Vet vet = new Vet(); 33 | vet.setFirstName("Zaphod"); 34 | vet.setLastName("Beeblebrox"); 35 | vet.setId(123); 36 | Vet other = (Vet) SerializationUtils 37 | .deserialize(SerializationUtils.serialize(vet)); 38 | assertThat(other.getFirstName()).isEqualTo(vet.getFirstName()); 39 | assertThat(other.getLastName()).isEqualTo(vet.getLastName()); 40 | assertThat(other.getId()).isEqualTo(vet.getId()); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /samples/pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | 5 | 6 | org.springframework.boot.experimental 7 | spring-boot-auto-reflect-parent 8 | 1.0.0.BUILD-SNAPSHOT 9 | 10 | 11 | spring-boot-auto-reflect-samples 12 | pom 13 | Parent Demo 14 | 15 | 16 | empty 17 | demo 18 | mvc 19 | cloud 20 | petclinic 21 | 22 | 23 | 24 | 1.8 25 | 26 | 27 | 28 | 29 | 30 | org.apache.maven.plugins 31 | maven-deploy-plugin 32 | 33 | true 34 | false 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | spring-libs-snapshot 43 | http://repo.spring.io/libs-snapshot 44 | 45 | true 46 | 47 | 48 | true 49 | 50 | 51 | 52 | 53 | 54 | 55 | spring-libs-snapshot 56 | http://repo.spring.io/libs-snapshot 57 | 58 | true 59 | 60 | 61 | true 62 | 63 | 64 | 65 | 66 | 67 | --------------------------------------------------------------------------------