diff --git a/livelessons-bootstrap/livelessons-bootstrap-gradle/build.gradle b/livelessons-bootstrap/livelessons-bootstrap-gradle/build.gradle index c3feede..6a7d49c 100644 --- a/livelessons-bootstrap/livelessons-bootstrap-gradle/build.gradle +++ b/livelessons-bootstrap/livelessons-bootstrap-gradle/build.gradle @@ -1,5 +1,5 @@ buildscript { - ext { springBootVersion = '1.2.1.RELEASE' } + ext { springBootVersion = '1.4.1.RELEASE' } repositories { mavenCentral() } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } diff --git a/livelessons-choreography/livelessons-choreography-bookmark-service/pom.xml b/livelessons-choreography/livelessons-choreography-bookmark-service/pom.xml index 506ad7c..ea2acaa 100644 --- a/livelessons-choreography/livelessons-choreography-bookmark-service/pom.xml +++ b/livelessons-choreography/livelessons-choreography-bookmark-service/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-choreography/livelessons-choreography-bookmark-service/src/main/java/demo/BookmarkRestController.java b/livelessons-choreography/livelessons-choreography-bookmark-service/src/main/java/demo/BookmarkRestController.java index c040c4c..9596a25 100644 --- a/livelessons-choreography/livelessons-choreography-bookmark-service/src/main/java/demo/BookmarkRestController.java +++ b/livelessons-choreography/livelessons-choreography-bookmark-service/src/main/java/demo/BookmarkRestController.java @@ -2,7 +2,6 @@ import java.util.Collection; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,8 +12,11 @@ @RequestMapping("/{userId}/bookmarks") public class BookmarkRestController { - @Autowired - private BookmarkRepository bookmarkRepository; + private final BookmarkRepository bookmarkRepository; + + public BookmarkRestController(BookmarkRepository bookmarkRepository) { + this.bookmarkRepository = bookmarkRepository; + } @RequestMapping(method = RequestMethod.GET) public Collection getBookmarks(@PathVariable String userId) { diff --git a/livelessons-choreography/livelessons-choreography-contact-service/pom.xml b/livelessons-choreography/livelessons-choreography-contact-service/pom.xml index fab7985..4eb51cd 100644 --- a/livelessons-choreography/livelessons-choreography-contact-service/pom.xml +++ b/livelessons-choreography/livelessons-choreography-contact-service/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-choreography/livelessons-choreography-contact-service/src/main/java/demo/ContactRestController.java b/livelessons-choreography/livelessons-choreography-contact-service/src/main/java/demo/ContactRestController.java index 98f8f2f..3dc2e6c 100644 --- a/livelessons-choreography/livelessons-choreography-contact-service/src/main/java/demo/ContactRestController.java +++ b/livelessons-choreography/livelessons-choreography-contact-service/src/main/java/demo/ContactRestController.java @@ -2,7 +2,6 @@ import java.util.Collection; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,8 +12,11 @@ @RequestMapping("/{userId}/contacts") public class ContactRestController { - @Autowired - private ContactRepository contactRepository; + private final ContactRepository contactRepository; + + public ContactRestController(ContactRepository contactRepository) { + this.contactRepository = contactRepository; + } @RequestMapping(method = RequestMethod.GET) public Collection getContacts(@PathVariable String userId) { diff --git a/livelessons-choreography/livelessons-choreography-eureka-service/pom.xml b/livelessons-choreography/livelessons-choreography-eureka-service/pom.xml index e119668..ec4fa02 100644 --- a/livelessons-choreography/livelessons-choreography-eureka-service/pom.xml +++ b/livelessons-choreography/livelessons-choreography-eureka-service/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-choreography/livelessons-choreography-gateway/pom.xml b/livelessons-choreography/livelessons-choreography-gateway/pom.xml index 24ba979..e0fc439 100644 --- a/livelessons-choreography/livelessons-choreography-gateway/pom.xml +++ b/livelessons-choreography/livelessons-choreography-gateway/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud @@ -31,7 +42,10 @@ io.projectreactor reactor-core - 2.0.0.RC1 + + + io.projectreactor + reactor-stream diff --git a/livelessons-choreography/livelessons-choreography-gateway/src/main/java/demo/PassportRestController.java b/livelessons-choreography/livelessons-choreography-gateway/src/main/java/demo/PassportRestController.java index 5160fb3..139eede 100644 --- a/livelessons-choreography/livelessons-choreography-gateway/src/main/java/demo/PassportRestController.java +++ b/livelessons-choreography/livelessons-choreography-gateway/src/main/java/demo/PassportRestController.java @@ -2,7 +2,6 @@ import reactor.rx.Stream; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -11,8 +10,11 @@ @RestController public class PassportRestController { - @Autowired - private PassportService passportService; + private final PassportService passportService; + + public PassportRestController(PassportService passportService) { + this.passportService = passportService; + } @RequestMapping("/{userId}/passport") public DeferredResult passport(@PathVariable String userId) { diff --git a/livelessons-choreography/livelessons-choreography-gateway/src/main/java/demo/PassportService.java b/livelessons-choreography/livelessons-choreography-gateway/src/main/java/demo/PassportService.java index c0dfec8..372f207 100644 --- a/livelessons-choreography/livelessons-choreography-gateway/src/main/java/demo/PassportService.java +++ b/livelessons-choreography/livelessons-choreography-gateway/src/main/java/demo/PassportService.java @@ -4,20 +4,23 @@ import reactor.rx.Stream; import reactor.rx.Streams; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class PassportService { - @Autowired - private Environment environment; + private final Environment environment; - @Autowired - private ContactClient contactClient; + private final ContactClient contactClient; - @Autowired - private BookmarkClient bookmarkClient; + private final BookmarkClient bookmarkClient; + + public PassportService(Environment environment, ContactClient contactClient, + BookmarkClient bookmarkClient) { + this.environment = environment; + this.contactClient = contactClient; + this.bookmarkClient = bookmarkClient; + } public Stream getBookmarks(String userId) { return Streams.create(subscriber -> { diff --git a/livelessons-choreography/livelessons-choreography-hystrix-dashboard-service/pom.xml b/livelessons-choreography/livelessons-choreography-hystrix-dashboard-service/pom.xml index 08f40b4..5e0aba3 100644 --- a/livelessons-choreography/livelessons-choreography-hystrix-dashboard-service/pom.xml +++ b/livelessons-choreography/livelessons-choreography-hystrix-dashboard-service/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-choreography/livelessons-choreography-hystrix/pom.xml b/livelessons-choreography/livelessons-choreography-hystrix/pom.xml index 441fe6d..5a54df7 100644 --- a/livelessons-choreography/livelessons-choreography-hystrix/pom.xml +++ b/livelessons-choreography/livelessons-choreography-hystrix/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-choreography/livelessons-choreography-hystrix/src/main/java/demo/IntegrationClient.java b/livelessons-choreography/livelessons-choreography-hystrix/src/main/java/demo/IntegrationClient.java index 9e0bd70..226a8f0 100644 --- a/livelessons-choreography/livelessons-choreography-hystrix/src/main/java/demo/IntegrationClient.java +++ b/livelessons-choreography/livelessons-choreography-hystrix/src/main/java/demo/IntegrationClient.java @@ -5,17 +5,19 @@ import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component class IntegrationClient { - @Autowired - private ContactClient contactClient; + private final ContactClient contactClient; - @Autowired - private BookmarkClient bookmarkClient; + private final BookmarkClient bookmarkClient; + + public IntegrationClient(ContactClient contactClient, BookmarkClient bookmarkClient) { + this.contactClient = contactClient; + this.bookmarkClient = bookmarkClient; + } public Collection getBookmarksFallback(String userId) { System.out.println("getBookmarksFallback"); @@ -37,4 +39,4 @@ public Collection getContacts(String userId) { return this.contactClient.getContacts(userId); } -} \ No newline at end of file +} diff --git a/livelessons-choreography/livelessons-choreography-hystrix/src/main/java/demo/PassportRestController.java b/livelessons-choreography/livelessons-choreography-hystrix/src/main/java/demo/PassportRestController.java index ec11f5c..021f3de 100644 --- a/livelessons-choreography/livelessons-choreography-hystrix/src/main/java/demo/PassportRestController.java +++ b/livelessons-choreography/livelessons-choreography-hystrix/src/main/java/demo/PassportRestController.java @@ -1,6 +1,5 @@ package demo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -8,8 +7,11 @@ @RestController class PassportRestController { - @Autowired - private IntegrationClient integrationClient; + private final IntegrationClient integrationClient; + + public PassportRestController(IntegrationClient integrationClient) { + this.integrationClient = integrationClient; + } @RequestMapping("/{userId}/passport") Passport passport(@PathVariable String userId) { @@ -17,4 +19,4 @@ Passport passport(@PathVariable String userId) { this.integrationClient.getBookmarks(userId)); } -} \ No newline at end of file +} diff --git a/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/pom.xml b/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/pom.xml index 1db5cff..61b309e 100644 --- a/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/pom.xml +++ b/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/DiscoveryClientExample.java b/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/DiscoveryClientExample.java index cd0f8f7..4b11db3 100644 --- a/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/DiscoveryClientExample.java +++ b/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/DiscoveryClientExample.java @@ -2,7 +2,6 @@ import org.apache.commons.lang.builder.ToStringBuilder; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; @@ -13,8 +12,11 @@ @Component public class DiscoveryClientExample implements CommandLineRunner { - @Autowired - private DiscoveryClient discoveryClient; + private final DiscoveryClient discoveryClient; + + public DiscoveryClientExample(DiscoveryClient discoveryClient) { + this.discoveryClient = discoveryClient; + } @Override public void run(String... strings) throws Exception { diff --git a/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/FeignExample.java b/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/FeignExample.java index ab4c569..e556137 100644 --- a/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/FeignExample.java +++ b/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/FeignExample.java @@ -1,6 +1,5 @@ package demo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; @@ -9,11 +8,14 @@ @Component public class FeignExample implements CommandLineRunner { - @Autowired - private ContactClient contactClient; + private final ContactClient contactClient; - @Autowired - private BookmarkClient bookmarkClient; + private final BookmarkClient bookmarkClient; + + public FeignExample(ContactClient contactClient, BookmarkClient bookmarkClient) { + this.contactClient = contactClient; + this.bookmarkClient = bookmarkClient; + } @Override public void run(String... strings) throws Exception { diff --git a/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/RestTemplateExample.java b/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/RestTemplateExample.java index fc94120..856facb 100644 --- a/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/RestTemplateExample.java +++ b/livelessons-choreography/livelessons-choreography-ribbon-and-eureka/src/main/java/demo/RestTemplateExample.java @@ -2,7 +2,6 @@ import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.annotation.Order; @@ -15,8 +14,11 @@ @Component public class RestTemplateExample implements CommandLineRunner { - @Autowired - private RestTemplate restTemplate; + private final RestTemplate restTemplate; + + public RestTemplateExample(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } @Override public void run(String... strings) throws Exception { diff --git a/livelessons-cloud/livelessons-cloud-connectors/src/main/java/demo/ExampleController.java b/livelessons-cloud/livelessons-cloud-connectors/src/main/java/demo/ExampleController.java index fee31e9..9e6ea3c 100644 --- a/livelessons-cloud/livelessons-cloud-connectors/src/main/java/demo/ExampleController.java +++ b/livelessons-cloud/livelessons-cloud-connectors/src/main/java/demo/ExampleController.java @@ -1,6 +1,5 @@ package demo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.app.ApplicationInstanceInfo; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.RequestMapping; @@ -13,7 +12,6 @@ public class ExampleController { private final ApplicationInstanceInfo info; - @Autowired public ExampleController(JdbcTemplate jdbc, ApplicationInstanceInfo info) { this.jdbc = jdbc; this.info = info; @@ -21,12 +19,13 @@ public ExampleController(JdbcTemplate jdbc, ApplicationInstanceInfo info) { @RequestMapping("/") public String hello() { - return jdbc.queryForObject("select model from car where id = 1", String.class); + return this.jdbc.queryForObject("select model from car where id = 1", + String.class); } @RequestMapping("/cloudinfo") public ApplicationInstanceInfo info() { - return info; + return this.info; } } diff --git a/livelessons-cloud/livelessons-cloud-s3/pom.xml b/livelessons-cloud/livelessons-cloud-s3/pom.xml index fb3d203..7fa49a7 100644 --- a/livelessons-cloud/livelessons-cloud-s3/pom.xml +++ b/livelessons-cloud/livelessons-cloud-s3/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.boot diff --git a/livelessons-cloud/livelessons-cloud-s3/src/main/java/demo/CloudS3Application.java b/livelessons-cloud/livelessons-cloud-s3/src/main/java/demo/CloudS3Application.java index bde8399..d772890 100644 --- a/livelessons-cloud/livelessons-cloud-s3/src/main/java/demo/CloudS3Application.java +++ b/livelessons-cloud/livelessons-cloud-s3/src/main/java/demo/CloudS3Application.java @@ -6,7 +6,6 @@ import javax.annotation.PostConstruct; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -23,12 +22,15 @@ public class CloudS3Application { @Value("${livelessons.s3.bucket}") private String bucket; - @Autowired - public ResourceLoader resourceLoader; + private final ResourceLoader resourceLoader; + + public CloudS3Application(ResourceLoader resourceLoader) { + this.resourceLoader = resourceLoader; + } @PostConstruct public void resourceAccess() throws IOException { - String location = "s3://" + bucket + "/file.txt"; + String location = "s3://" + this.bucket + "/file.txt"; WritableResource writeableResource = (WritableResource) this.resourceLoader .getResource(location); FileCopyUtils.copy("Hello World!", diff --git a/livelessons-cloud/livelessons-cloud-services/src/main/java/demo/ExampleController.java b/livelessons-cloud/livelessons-cloud-services/src/main/java/demo/ExampleController.java index f82de30..d3c2e5d 100644 --- a/livelessons-cloud/livelessons-cloud-services/src/main/java/demo/ExampleController.java +++ b/livelessons-cloud/livelessons-cloud-services/src/main/java/demo/ExampleController.java @@ -1,6 +1,5 @@ package demo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -10,7 +9,6 @@ public class ExampleController { private final JdbcTemplate jdbc; - @Autowired public ExampleController(JdbcTemplate jdbc) { this.jdbc = jdbc; } diff --git a/livelessons-cloud/livelessons-cloud-session/pom.xml b/livelessons-cloud/livelessons-cloud-session/pom.xml index 8d9b509..94f0015 100644 --- a/livelessons-cloud/livelessons-cloud-session/pom.xml +++ b/livelessons-cloud/livelessons-cloud-session/pom.xml @@ -31,7 +31,6 @@ org.springframework.session spring-session-data-redis - 1.0.0.RELEASE diff --git a/livelessons-configuration/livelessons-configuration-basic/pom.xml b/livelessons-configuration/livelessons-configuration-basic/pom.xml index cd4e4b0..c49ba4a 100644 --- a/livelessons-configuration/livelessons-configuration-basic/pom.xml +++ b/livelessons-configuration/livelessons-configuration-basic/pom.xml @@ -20,5 +20,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-configuration-processor + true + diff --git a/livelessons-configuration/livelessons-configuration-cloudclient/pom.xml b/livelessons-configuration/livelessons-configuration-cloudclient/pom.xml index fb73c07..2fff35b 100644 --- a/livelessons-configuration/livelessons-configuration-cloudclient/pom.xml +++ b/livelessons-configuration/livelessons-configuration-cloudclient/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-configuration/livelessons-configuration-cloudserver/pom.xml b/livelessons-configuration/livelessons-configuration-cloudserver/pom.xml index 9d5a56d..38228ae 100644 --- a/livelessons-configuration/livelessons-configuration-cloudserver/pom.xml +++ b/livelessons-configuration/livelessons-configuration-cloudserver/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-data/livelessons-data-elasticsearch/src/main/java/demo/DataElasticsearchApplication.java b/livelessons-data/livelessons-data-elasticsearch/src/main/java/demo/DataElasticsearchApplication.java index 3bbbc0c..3d4ef59 100644 --- a/livelessons-data/livelessons-data-elasticsearch/src/main/java/demo/DataElasticsearchApplication.java +++ b/livelessons-data/livelessons-data-elasticsearch/src/main/java/demo/DataElasticsearchApplication.java @@ -9,7 +9,7 @@ import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder; import org.springframework.data.elasticsearch.core.query.SearchQuery; -import static org.elasticsearch.index.query.QueryBuilders.fuzzyLikeThisFieldQuery; +import static org.elasticsearch.index.query.QueryBuilders.fuzzyQuery; @SpringBootApplication public class DataElasticsearchApplication { @@ -33,7 +33,7 @@ public CommandLineRunner example(CarRepository repository, System.err.println("\nFrom the template..."); SearchQuery query = new NativeSearchQueryBuilder() - .withQuery(fuzzyLikeThisFieldQuery("make").likeText("Ronda")).build(); + .withQuery(fuzzyQuery("make", "Ronda")).build(); template.queryForList(query, Car.class).forEach(System.err::println); }; } diff --git a/livelessons-data/livelessons-data-jdbc/src/main/java/demo/CarRepository.java b/livelessons-data/livelessons-data-jdbc/src/main/java/demo/CarRepository.java index d538ac3..d8ddbf8 100644 --- a/livelessons-data/livelessons-data-jdbc/src/main/java/demo/CarRepository.java +++ b/livelessons-data/livelessons-data-jdbc/src/main/java/demo/CarRepository.java @@ -2,7 +2,6 @@ import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -11,13 +10,12 @@ public class CarRepository { private final JdbcTemplate jdbc; - @Autowired public CarRepository(JdbcTemplate jdbc) { this.jdbc = jdbc; } public List findByMakeIgnoringCase(String make) { - return jdbc.query( + return this.jdbc.query( "select * from car " + "where UPPER(car.make) = UPPER(?) order by id", (rs, i) -> new Car(rs.getInt("id"), rs.getString("make"), rs.getString("model"), rs.getInt("year")), diff --git a/livelessons-data/livelessons-data-redis/src/main/java/demo/Demo.java b/livelessons-data/livelessons-data-redis/src/main/java/demo/Demo.java index 2c95132..908d33f 100644 --- a/livelessons-data/livelessons-data-redis/src/main/java/demo/Demo.java +++ b/livelessons-data/livelessons-data-redis/src/main/java/demo/Demo.java @@ -6,7 +6,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; @@ -22,7 +21,6 @@ public class Demo implements CommandLineRunner { private final SlowService service; - @Autowired public Demo(StringRedisTemplate template, SlowService service) { this.template = template; this.service = service; diff --git a/livelessons-data/livelessons-data-rest/src/test/java/demo/DataRestApplicationTests.java b/livelessons-data/livelessons-data-rest/src/test/java/demo/DataRestApplicationTests.java index a40a1cb..d023f7f 100644 --- a/livelessons-data/livelessons-data-rest/src/test/java/demo/DataRestApplicationTests.java +++ b/livelessons-data/livelessons-data-rest/src/test/java/demo/DataRestApplicationTests.java @@ -3,45 +3,38 @@ import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.TestRestTemplate; -import org.springframework.boot.test.WebIntegrationTest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import static org.hamcrest.Matchers.containsString; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.not; -import static org.junit.Assert.assertThat; +import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = DataRestApplication.class) -@WebIntegrationTest(randomPort = true) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class DataRestApplicationTests { - @Value("${local.server.port}") - private int port; + @Autowired + private TestRestTemplate restTemplate; @Test public void getCar() throws Exception { - String url = "http://localhost:" + this.port + "/cars/1"; - ResponseEntity entity = new TestRestTemplate().getForEntity(url, + ResponseEntity entity = this.restTemplate.getForEntity("/cars/1", String.class); - assertThat(entity.getStatusCode(), equalTo(HttpStatus.OK)); - assertThat(entity.getBody(), containsString("Civic")); + assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(entity.getBody()).contains("Civic"); } @Test public void findCars() throws Exception { - String url = "http://localhost:" + this.port + "/cars/search/find?make=honda"; - ResponseEntity entity = new TestRestTemplate().getForEntity(url, - String.class); - assertThat(entity.getStatusCode(), equalTo(HttpStatus.OK)); - assertThat(entity.getBody(), containsString("cars/1")); - assertThat(entity.getBody(), containsString("cars/2")); - assertThat(entity.getBody(), not(containsString("cars/3"))); + ResponseEntity entity = this.restTemplate + .getForEntity("/cars/search/find?make=honda", String.class); + assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(entity.getBody()).contains("cars/1", "cars/2") + .doesNotContain("cars/3"); } } diff --git a/livelessons-integration/livelessons-integration-basic-messaging/src/main/java/demo/Producer.java b/livelessons-integration/livelessons-integration-basic-messaging/src/main/java/demo/Producer.java index 87cdcde..408d01b 100644 --- a/livelessons-integration/livelessons-integration-basic-messaging/src/main/java/demo/Producer.java +++ b/livelessons-integration/livelessons-integration-basic-messaging/src/main/java/demo/Producer.java @@ -6,15 +6,17 @@ import java.util.UUID; import org.springframework.amqp.rabbit.core.RabbitMessagingTemplate; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; @Component public class Producer implements CommandLineRunner { - @Autowired - private RabbitMessagingTemplate messagingTemplate; + private final RabbitMessagingTemplate messagingTemplate; + + public Producer(RabbitMessagingTemplate messagingTemplate) { + this.messagingTemplate = messagingTemplate; + } @Override public void run(String... args) throws Exception { diff --git a/livelessons-integration/livelessons-integration-batch/src/main/java/demo/ContactBatchJobConfiguration.java b/livelessons-integration/livelessons-integration-batch/src/main/java/demo/ContactBatchJobConfiguration.java index 2d7149b..2670309 100644 --- a/livelessons-integration/livelessons-integration-batch/src/main/java/demo/ContactBatchJobConfiguration.java +++ b/livelessons-integration/livelessons-integration-batch/src/main/java/demo/ContactBatchJobConfiguration.java @@ -16,7 +16,6 @@ import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; import org.springframework.batch.item.file.mapping.DefaultLineMapper; import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.batch.JobExecutionEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; @@ -88,13 +87,16 @@ public JdbcTemplate jdbcTemplate(DataSource dataSource) { public static class BatchJobFinishedListener implements ApplicationListener { - @Autowired - private JdbcTemplate jdbcTemplate; + private final JdbcTemplate jdbcTemplate; + + public BatchJobFinishedListener(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } @Override public void onApplicationEvent(JobExecutionEvent event) { System.out.println("finished " + event.getJobExecution().toString()); - jdbcTemplate + this.jdbcTemplate .query("SELECT first_name, last_name, email FROM contact", (rs, i) -> new Contact(rs.getString("first_name"), rs.getString("last_name"), rs.getString("email"))) diff --git a/livelessons-operations/livelessons-operations-cloud-monitoring/src/main/java/demo/ExampleController.java b/livelessons-operations/livelessons-operations-cloud-monitoring/src/main/java/demo/ExampleController.java index 87ce004..da7314b 100644 --- a/livelessons-operations/livelessons-operations-cloud-monitoring/src/main/java/demo/ExampleController.java +++ b/livelessons-operations/livelessons-operations-cloud-monitoring/src/main/java/demo/ExampleController.java @@ -1,6 +1,5 @@ package demo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -9,7 +8,6 @@ public class ExampleController { private final ExampleHealthIndicator indicator; - @Autowired public ExampleController(ExampleHealthIndicator indicator) { this.indicator = indicator; } diff --git a/livelessons-operations/livelessons-operations-metrics/src/main/java/demo/ExampleController.java b/livelessons-operations/livelessons-operations-metrics/src/main/java/demo/ExampleController.java index 919a03c..37a260a 100644 --- a/livelessons-operations/livelessons-operations-metrics/src/main/java/demo/ExampleController.java +++ b/livelessons-operations/livelessons-operations-metrics/src/main/java/demo/ExampleController.java @@ -1,6 +1,5 @@ package demo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -9,7 +8,6 @@ public class ExampleController { private final ExampleService service; - @Autowired public ExampleController(ExampleService service) { this.service = service; } diff --git a/livelessons-operations/livelessons-operations-metrics/src/main/java/demo/ExampleService.java b/livelessons-operations/livelessons-operations-metrics/src/main/java/demo/ExampleService.java index bb5da2a..0a9de5f 100644 --- a/livelessons-operations/livelessons-operations-metrics/src/main/java/demo/ExampleService.java +++ b/livelessons-operations/livelessons-operations-metrics/src/main/java/demo/ExampleService.java @@ -2,7 +2,6 @@ import java.util.Random; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.metrics.CounterService; import org.springframework.boot.actuate.metrics.GaugeService; import org.springframework.stereotype.Service; @@ -16,7 +15,6 @@ public class ExampleService { private final GaugeService gaugeService; - @Autowired public ExampleService(CounterService counterService, GaugeService gaugeService) { this.counterService = counterService; this.gaugeService = gaugeService; @@ -24,7 +22,7 @@ public ExampleService(CounterService counterService, GaugeService gaugeService) public void call() { this.counterService.increment("example.counter"); - this.gaugeService.submit("example.gauge", random.nextDouble()); + this.gaugeService.submit("example.gauge", this.random.nextDouble()); } } diff --git a/livelessons-parent/pom.xml b/livelessons-parent/pom.xml index 8e157b2..5e4cb4f 100644 --- a/livelessons-parent/pom.xml +++ b/livelessons-parent/pom.xml @@ -7,15 +7,14 @@ 1.0.0-SNAPSHOT pom - org.springframework.cloud - spring-cloud-starter-parent - 1.0.2.RELEASE + org.springframework.boot + spring-boot-starter-parent + 1.4.1.RELEASE ../.. 1.8 - 2.0.6.RELEASE diff --git a/livelessons-rest/livelessons-rest-errors/src/main/java/demo/PersonPhotoRestController.java b/livelessons-rest/livelessons-rest-errors/src/main/java/demo/PersonPhotoRestController.java index b571b83..6d96e40 100644 --- a/livelessons-rest/livelessons-rest-errors/src/main/java/demo/PersonPhotoRestController.java +++ b/livelessons-rest/livelessons-rest-errors/src/main/java/demo/PersonPhotoRestController.java @@ -5,7 +5,6 @@ import java.io.FileOutputStream; import java.net.URI; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; @@ -29,8 +28,11 @@ public class PersonPhotoRestController { private File root; - @Autowired - private PersonRepository personRepository; + private final PersonRepository personRepository; + + public PersonPhotoRestController(PersonRepository personRepository) { + this.personRepository = personRepository; + } @Value("${user.home}") void setUserHome(String home) { diff --git a/livelessons-security/livelessons-security-basic/src/main/java/basic/CustomGlobalAuthenticationManagerConfiguration.java b/livelessons-security/livelessons-security-basic/src/main/java/basic/CustomGlobalAuthenticationManagerConfiguration.java index e34dee2..d814f66 100644 --- a/livelessons-security/livelessons-security-basic/src/main/java/basic/CustomGlobalAuthenticationManagerConfiguration.java +++ b/livelessons-security/livelessons-security-basic/src/main/java/basic/CustomGlobalAuthenticationManagerConfiguration.java @@ -1,6 +1,5 @@ package basic; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.authentication.configuration.EnableGlobalAuthentication; @@ -12,8 +11,12 @@ public class CustomGlobalAuthenticationManagerConfiguration extends GlobalAuthenticationConfigurerAdapter { - @Autowired - private UserDetailsService userDetailsService; + private final UserDetailsService userDetailsService; + + public CustomGlobalAuthenticationManagerConfiguration( + UserDetailsService userDetailsService) { + this.userDetailsService = userDetailsService; + } @Override public void init(AuthenticationManagerBuilder auth) throws Exception { diff --git a/livelessons-security/livelessons-security-basic/src/test/java/basic/BasicSecurityApplicationTests.java b/livelessons-security/livelessons-security-basic/src/test/java/basic/BasicSecurityApplicationTests.java index b042a1d..ba17cfb 100644 --- a/livelessons-security/livelessons-security-basic/src/test/java/basic/BasicSecurityApplicationTests.java +++ b/livelessons-security/livelessons-security-basic/src/test/java/basic/BasicSecurityApplicationTests.java @@ -1,74 +1,37 @@ package basic; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; +import org.springframework.boot.context.embedded.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.ResponseEntity; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; +import static org.assertj.core.api.Assertions.assertThat; + @RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = BasicSecurityApplication.class) -@WebIntegrationTest(randomPort = true) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class BasicSecurityApplicationTests { - @Value("${local.server.port}") - private int port; - @Autowired - private RestTemplate restTemplate; + private RestTemplateBuilder restTemplateBuilder; + + @LocalServerPort + private int port; @Test public void contextLoaded() throws Throwable { - ResponseEntity re = restTemplate - .getForEntity("http://localhost:" + port + "/hi", String.class); - String actual = re.getBody().trim().toLowerCase(); - Assert.assertTrue(actual.contains("hello")); - System.out.println("received: " + actual); - } - - @Configuration - public static class BasicAuthRestTemplateConfig { - - private String user = "pwebb", password = "boot"; - - @Bean - RestTemplate auth() { - // credentials - UsernamePasswordCredentials credentials = new UsernamePasswordCredentials( - this.user, this.password); - - CredentialsProvider credsProvider = new BasicCredentialsProvider(); - credsProvider.setCredentials(AuthScope.ANY, credentials); - - // set credentialsProvider on httpClient - HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); - - httpClientBuilder.setDefaultCredentialsProvider(credsProvider); - CloseableHttpClient httpClient = httpClientBuilder.build(); - - HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory( - httpClient); - - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setRequestFactory(factory); - - return restTemplate; - } + RestTemplate restTemplate = this.restTemplateBuilder + .basicAuthorization("pwebb", "boot").build(); + ResponseEntity response = restTemplate + .getForEntity("http://localhost:" + this.port + "/hi", String.class); + assertThat(response.getBody()).containsIgnoringCase("hello"); + System.out.println("received: " + response.getBody()); } } diff --git a/livelessons-security/livelessons-security-https/src/main/java/demo/SecurityConfig.java b/livelessons-security/livelessons-security-https/src/main/java/demo/SecurityConfig.java index bc5cd55..34b02ca 100644 --- a/livelessons-security/livelessons-security-https/src/main/java/demo/SecurityConfig.java +++ b/livelessons-security/livelessons-security-https/src/main/java/demo/SecurityConfig.java @@ -18,8 +18,11 @@ @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { - @Autowired - private JdbcTemplate jdbcTemplate; + private final JdbcTemplate jdbcTemplate; + + public SecurityConfig(JdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; + } @Autowired public void configureGlobal(AuthenticationManagerBuilder auth, diff --git a/livelessons-security/livelessons-security-https/src/test/java/demo/BasicHttpsSecurityApplicationTest.java b/livelessons-security/livelessons-security-https/src/test/java/demo/BasicHttpsSecurityApplicationTest.java deleted file mode 100644 index 570559b..0000000 --- a/livelessons-security/livelessons-security-https/src/test/java/demo/BasicHttpsSecurityApplicationTest.java +++ /dev/null @@ -1,106 +0,0 @@ -package demo; - -import java.io.IOException; -import java.io.InputStream; -import java.security.KeyStore; - -import javax.net.ssl.SSLContext; - -import org.apache.http.client.HttpClient; -import org.apache.http.conn.ssl.AllowAllHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLContextBuilder; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.impl.client.HttpClients; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.SpringApplicationConfiguration; -import org.springframework.boot.test.WebIntegrationTest; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.core.io.ClassPathResource; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.web.client.ResourceAccessException; -import org.springframework.web.client.RestTemplate; - -@RunWith(SpringJUnit4ClassRunner.class) -@SpringApplicationConfiguration(classes = BasicHttpsSecurityApplication.class) -@WebIntegrationTest(randomPort = true) -public class BasicHttpsSecurityApplicationTest { - - @Autowired - private RestTemplate template; - - @Value("${local.server.port}") - private String port; - - @Configuration - public static class RestClientConfiguration { - - HttpClient httpClient() throws Exception { - return HttpClients.custom().setSSLSocketFactory(socketFactory()).build(); - } - - SSLConnectionSocketFactory socketFactory() throws Exception { - char[] password = "password".toCharArray(); - KeyStore truststore = KeyStore.getInstance("PKCS12"); - truststore.load(getKeyStoreFile(), password); - SSLContextBuilder builder = new SSLContextBuilder(); - builder.loadKeyMaterial(truststore, password); - builder.loadTrustMaterial(truststore, new TrustSelfSignedStrategy()); - return new SSLConnectionSocketFactory(builder.build(), - new AllowAllHostnameVerifier()); - } - - InputStream getKeyStoreFile() throws IOException { - ClassPathResource resource = new ClassPathResource("rod.p12"); - return resource.getInputStream(); - } - - @Bean - RestTemplate authenticatedRestTemplate() throws Exception { - HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory( - httpClient()); - return new RestTemplate(factory); - } - } - - private SSLContext defaultContext; - - @Before - public void setUp() throws Exception { - this.defaultContext = SSLContext.getDefault(); - } - - @After - public void reset() throws Exception { - SSLContext.setDefault(this.defaultContext); - } - - @Test(expected = ResourceAccessException.class) - public void testUnauthenticatedHello() throws Exception { - RestTemplate template = new RestTemplate(); - ResponseEntity httpsEntity = template - .getForEntity("https://localhost:" + this.port + "/hi", String.class); - Assert.assertEquals(HttpStatus.OK, httpsEntity.getStatusCode()); - Assert.assertTrue(httpsEntity.getBody().toLowerCase().contains("hello, world")); - } - - @Test - public void testAuthenticatedHello() throws Exception { - ResponseEntity httpsEntity = this.template - .getForEntity("https://localhost:" + this.port + "/hi", String.class); - Assert.assertEquals(HttpStatus.OK, httpsEntity.getStatusCode()); - Assert.assertTrue(httpsEntity.getBody().toLowerCase().contains("hello, world")); - } - -} diff --git a/livelessons-security/livelessons-security-https/src/test/java/demo/BasicHttpsSecurityApplicationTests.java b/livelessons-security/livelessons-security-https/src/test/java/demo/BasicHttpsSecurityApplicationTests.java new file mode 100644 index 0000000..1fe9a1e --- /dev/null +++ b/livelessons-security/livelessons-security-https/src/test/java/demo/BasicHttpsSecurityApplicationTests.java @@ -0,0 +1,91 @@ +package demo; + +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyStore; + +import javax.net.ssl.SSLContext; + +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContextBuilder; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.context.embedded.LocalServerPort; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.web.client.ResourceAccessException; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +public class BasicHttpsSecurityApplicationTests { + + private SSLContext defaultContext; + + @Autowired + private TestRestTemplate restTemplate; + + @LocalServerPort + private int port; + + @Before + public void setUp() throws Exception { + this.defaultContext = SSLContext.getDefault(); + } + + @After + public void reset() throws Exception { + SSLContext.setDefault(this.defaultContext); + } + + @Test(expected = ResourceAccessException.class) + public void testUnauthenticatedHello() throws Exception { + ResponseEntity httpsEntity = this.restTemplate.getForEntity("/hi", + String.class); + assertThat(httpsEntity.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(httpsEntity.getBody()).containsIgnoringCase("hello, world"); + } + + @Test + public void testAuthenticatedHello() throws Exception { + TestRestTemplate restTemplate = new TestRestTemplate(); + restTemplate.getRestTemplate() + .setRequestFactory(new HttpComponentsClientHttpRequestFactory(HttpClients + .custom().setSSLSocketFactory(socketFactory()).build())); + ResponseEntity httpsEntity = restTemplate + .getForEntity("https://localhost:" + this.port + "/hi", String.class); + assertThat(httpsEntity.getStatusCode()).isEqualTo(HttpStatus.OK); + assertThat(httpsEntity.getBody()).containsIgnoringCase("hello, world"); + } + + private SSLConnectionSocketFactory socketFactory() throws Exception { + char[] password = "password".toCharArray(); + KeyStore truststore = KeyStore.getInstance("PKCS12"); + truststore.load(getKeyStoreFile(), password); + SSLContextBuilder builder = new SSLContextBuilder(); + builder.loadKeyMaterial(truststore, password); + builder.loadTrustMaterial(truststore, new TrustSelfSignedStrategy()); + return new SSLConnectionSocketFactory(builder.build(), + new NoopHostnameVerifier()); + } + + private InputStream getKeyStoreFile() throws IOException { + ClassPathResource resource = new ClassPathResource("rod.p12"); + return resource.getInputStream(); + } + +} diff --git a/livelessons-security/livelessons-security-sso-auth-server/src/main/java/demo/OAuth2Config.java b/livelessons-security/livelessons-security-sso-auth-server/src/main/java/demo/OAuth2Config.java index e5ae7c3..9fca614 100644 --- a/livelessons-security/livelessons-security-sso-auth-server/src/main/java/demo/OAuth2Config.java +++ b/livelessons-security/livelessons-security-sso-auth-server/src/main/java/demo/OAuth2Config.java @@ -1,6 +1,5 @@ package demo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; @@ -12,13 +11,16 @@ @EnableAuthorizationServer class OAuth2Config extends AuthorizationServerConfigurerAdapter { - @Autowired - private AuthenticationManager authenticationManager; + private final AuthenticationManager authenticationManager; + + public OAuth2Config(AuthenticationManager authenticationManager) { + this.authenticationManager = authenticationManager; + } @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { - endpoints.authenticationManager(authenticationManager); + endpoints.authenticationManager(this.authenticationManager); } @Override diff --git a/livelessons-security/livelessons-security-sso-auth-server/src/main/java/demo/SecurityConfig.java b/livelessons-security/livelessons-security-sso-auth-server/src/main/java/demo/SecurityConfig.java index 3602fc3..38ded78 100644 --- a/livelessons-security/livelessons-security-sso-auth-server/src/main/java/demo/SecurityConfig.java +++ b/livelessons-security/livelessons-security-sso-auth-server/src/main/java/demo/SecurityConfig.java @@ -1,6 +1,5 @@ package demo; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.authentication.configuration.EnableGlobalAuthentication; @@ -11,8 +10,11 @@ @EnableGlobalAuthentication public class SecurityConfig extends GlobalAuthenticationConfigurerAdapter { - @Autowired - private UserDetailsService userDetailsService; + private final UserDetailsService userDetailsService; + + public SecurityConfig(UserDetailsService userDetailsService) { + this.userDetailsService = userDetailsService; + } @Override public void init(AuthenticationManagerBuilder auth) throws Exception { diff --git a/livelessons-security/livelessons-security-sso-resource/pom.xml b/livelessons-security/livelessons-security-sso-resource/pom.xml index 944b9ab..03cbec4 100644 --- a/livelessons-security/livelessons-security-sso-resource/pom.xml +++ b/livelessons-security/livelessons-security-sso-resource/pom.xml @@ -11,6 +11,17 @@ ../.. + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-security/livelessons-security-sso-resource/src/main/java/demo/SsoResourceApplication.java b/livelessons-security/livelessons-security-sso-resource/src/main/java/demo/SsoResourceApplication.java index e8050ca..a1037f1 100644 --- a/livelessons-security/livelessons-security-sso-resource/src/main/java/demo/SsoResourceApplication.java +++ b/livelessons-security/livelessons-security-sso-resource/src/main/java/demo/SsoResourceApplication.java @@ -7,7 +7,7 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.security.oauth2.resource.EnableOAuth2Resource; +import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -16,7 +16,7 @@ * @author Dave Syer (THANK YOU DAVE!) */ @SpringBootApplication -@EnableOAuth2Resource +@EnableResourceServer @RestController public class SsoResourceApplication { diff --git a/livelessons-security/livelessons-security-sso-resource/src/main/resources/application.properties b/livelessons-security/livelessons-security-sso-resource/src/main/resources/application.properties index c8684b4..2d353d1 100644 --- a/livelessons-security/livelessons-security-sso-resource/src/main/resources/application.properties +++ b/livelessons-security/livelessons-security-sso-resource/src/main/resources/application.properties @@ -1,3 +1,3 @@ server.port: 9000 server.address: 127.0.0.1 -spring.oauth2.resource.userInfoUri: http://localhost:9999/uaa/user +security.oauth2.resource.userInfoUri: http://localhost:9999/uaa/user diff --git a/livelessons-security/livelessons-security-sso-ui/pom.xml b/livelessons-security/livelessons-security-sso-ui/pom.xml index c152938..7b5a921 100644 --- a/livelessons-security/livelessons-security-sso-ui/pom.xml +++ b/livelessons-security/livelessons-security-sso-ui/pom.xml @@ -12,6 +12,17 @@ ../.. 1.7.6 + + + + org.springframework.cloud + spring-cloud-dependencies + Brixton.SR4 + pom + import + + + org.springframework.cloud diff --git a/livelessons-security/livelessons-security-sso-ui/src/main/java/demo/SecurityConfiguration.java b/livelessons-security/livelessons-security-sso-ui/src/main/java/demo/SecurityConfiguration.java deleted file mode 100644 index 506809c..0000000 --- a/livelessons-security/livelessons-security-sso-ui/src/main/java/demo/SecurityConfiguration.java +++ /dev/null @@ -1,77 +0,0 @@ -package demo; - -import java.io.IOException; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.springframework.cloud.security.oauth2.sso.OAuth2SsoConfigurerAdapter; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.web.csrf.CsrfFilter; -import org.springframework.security.web.csrf.CsrfToken; -import org.springframework.security.web.csrf.CsrfTokenRepository; -import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository; -import org.springframework.web.filter.OncePerRequestFilter; -import org.springframework.web.util.WebUtils; - -@Configuration -class SecurityConfiguration extends OAuth2SsoConfigurerAdapter { - - @Override - public void match(RequestMatchers matchers) { - matchers.anyRequest(); - } - - @Override - public void configure(HttpSecurity http) throws Exception { - // @formatter:off - http - .authorizeRequests() - .antMatchers("/index.html", "/home.html", "/") - .permitAll() - .anyRequest() - .authenticated() - .and() - .csrf() - .csrfTokenRepository(csrfTokenRepository()) - .and() - .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class); - // @formatter:on - } - - private Filter csrfHeaderFilter() { - return new OncePerRequestFilter() { - - @Override - protected void doFilterInternal(HttpServletRequest request, - HttpServletResponse response, FilterChain filterChain) - throws ServletException, IOException { - CsrfToken csrf = (CsrfToken) request - .getAttribute(CsrfToken.class.getName()); - if (csrf != null) { - Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); - String token = csrf.getToken(); - if (cookie == null - || token != null && !token.equals(cookie.getValue())) { - cookie = new Cookie("XSRF-TOKEN", token); - cookie.setPath("/"); - response.addCookie(cookie); - } - } - filterChain.doFilter(request, response); - } - }; - } - - private CsrfTokenRepository csrfTokenRepository() { - HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); - repository.setHeaderName("X-XSRF-TOKEN"); - return repository; - } - -} diff --git a/livelessons-security/livelessons-security-sso-ui/src/main/java/demo/SsoUiApplication.java b/livelessons-security/livelessons-security-sso-ui/src/main/java/demo/SsoUiApplication.java index da58f04..0616d57 100644 --- a/livelessons-security/livelessons-security-sso-ui/src/main/java/demo/SsoUiApplication.java +++ b/livelessons-security/livelessons-security-sso-ui/src/main/java/demo/SsoUiApplication.java @@ -1,9 +1,26 @@ package demo; +import java.io.IOException; + +import javax.servlet.Filter; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; -import org.springframework.cloud.security.oauth2.sso.EnableOAuth2Sso; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.csrf.CsrfFilter; +import org.springframework.security.web.csrf.CsrfToken; +import org.springframework.security.web.csrf.CsrfTokenRepository; +import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.WebUtils; /** * @author Josh Long @@ -12,7 +29,55 @@ @SpringBootApplication @EnableZuulProxy @EnableOAuth2Sso -public class SsoUiApplication { +public class SsoUiApplication extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + // @formatter:off + http + .authorizeRequests() + .antMatchers("/index.html", "/home.html", "/") + .permitAll() + .anyRequest() + .authenticated() + .and() + .csrf() + .csrfTokenRepository(csrfTokenRepository()) + .and() + .addFilterAfter(csrfHeaderFilter(), CsrfFilter.class); + // @formatter:on + } + + private Filter csrfHeaderFilter() { + return new OncePerRequestFilter() { + + @Override + protected void doFilterInternal(HttpServletRequest request, + HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + CsrfToken csrf = (CsrfToken) request + .getAttribute(CsrfToken.class.getName()); + if (csrf != null) { + Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); + String token = csrf.getToken(); + if (cookie == null + || token != null && !token.equals(cookie.getValue())) { + cookie = new Cookie("XSRF-TOKEN", token); + cookie.setPath("/"); + response.addCookie(cookie); + } + } + filterChain.doFilter(request, response); + } + + }; + } + + private CsrfTokenRepository csrfTokenRepository() { + HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); + repository.setHeaderName("X-XSRF-TOKEN"); + return repository; + } public static void main(String[] args) { SpringApplication.run(SsoUiApplication.class, args); diff --git a/livelessons-security/livelessons-security-sso-ui/src/main/resources/application.yml b/livelessons-security/livelessons-security-sso-ui/src/main/resources/application.yml index 1d64c43..136e4fc 100644 --- a/livelessons-security/livelessons-security-sso-ui/src/main/resources/application.yml +++ b/livelessons-security/livelessons-security-sso-ui/src/main/resources/application.yml @@ -10,7 +10,7 @@ zuul: user: path: /user/** url: http://localhost:9999/uaa/user -spring: +security: oauth2: sso: home: @@ -27,4 +27,4 @@ spring: logging: level: org.springframework.security: DEBUG - org.springframework.web: DEBUG \ No newline at end of file + org.springframework.web: DEBUG diff --git a/livelessons-web/livelessons-web-resources/pom.xml b/livelessons-web/livelessons-web-resources/pom.xml index 871f4f7..839eeeb 100644 --- a/livelessons-web/livelessons-web-resources/pom.xml +++ b/livelessons-web/livelessons-web-resources/pom.xml @@ -19,6 +19,7 @@ org.webjars jquery + 2.1.1