├── .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 extends ApplicationEvent> 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