Merge pull request #8154 from sjmillington/rest-move-2
[BAEL-18365] Spring rest move 2
This commit is contained in:
		
						commit
						fbf857ce85
					
				| @ -8,3 +8,4 @@ This module contains articles about Spring Boot with Spring Data | ||||
| - [Rendering Exceptions in JSON with Spring](https://www.baeldung.com/spring-exceptions-json) | ||||
| - [Disable Spring Data Auto Configuration](https://www.baeldung.com/spring-data-disable-auto-config) | ||||
| - [Repositories with Multiple Spring Data Modules](https://www.baeldung.com/spring-multiple-data-modules) | ||||
| - [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) | ||||
|  | ||||
| @ -7,4 +7,8 @@ This module contains articles about administering a Spring Boot runtime | ||||
|  - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) | ||||
|  - [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) | ||||
|  - [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) | ||||
|  - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs)  | ||||
|  - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs)  | ||||
|  - [How to Change the Default Port in Spring Boot](https://www.baeldung.com/spring-boot-change-port) | ||||
|  - [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring) | ||||
|  - [CORS with Spring](https://www.baeldung.com/spring-cors) | ||||
|  - [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging) | ||||
| @ -32,6 +32,12 @@ | ||||
|             <artifactId>spring-boot-starter-test</artifactId> | ||||
|             <scope>test</scope> | ||||
|         </dependency> | ||||
|         <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> | ||||
|         <dependency> | ||||
|             <groupId>commons-io</groupId> | ||||
|             <artifactId>commons-io</artifactId> | ||||
|             <version>2.6</version> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.boot</groupId> | ||||
| @ -57,6 +63,10 @@ | ||||
|             <artifactId>spring-boot-admin-starter-client</artifactId> | ||||
|             <version>${spring-boot-admin-starter-client.version}</version> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.springframework.security</groupId> | ||||
|             <artifactId>spring-security-test</artifactId> | ||||
|         </dependency> | ||||
| 
 | ||||
|         <dependency> | ||||
|             <groupId>com.h2database</groupId> | ||||
|  | ||||
| @ -0,0 +1,15 @@ | ||||
| package com.baeldung.sampleapp.config; | ||||
| 
 | ||||
| import org.springframework.boot.SpringApplication; | ||||
| import org.springframework.boot.autoconfigure.EnableAutoConfiguration; | ||||
| import org.springframework.context.annotation.ComponentScan; | ||||
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||||
| 
 | ||||
| @EnableAutoConfiguration | ||||
| @ComponentScan("com.baeldung.sampleapp") | ||||
| public class MainApplication implements WebMvcConfigurer { | ||||
| 
 | ||||
|     public static void main(final String[] args) { | ||||
|         SpringApplication.run(MainApplication.class, args); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,29 @@ | ||||
| package com.baeldung.sampleapp.config; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.http.client.ClientHttpRequestInterceptor; | ||||
| import org.springframework.util.CollectionUtils; | ||||
| import org.springframework.web.client.RestTemplate; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.interceptors.RestTemplateHeaderModifierInterceptor; | ||||
| 
 | ||||
| @Configuration | ||||
| public class RestClientConfig { | ||||
| 
 | ||||
|     @Bean | ||||
|     public RestTemplate restTemplate() { | ||||
|         RestTemplate restTemplate = new RestTemplate(); | ||||
| 
 | ||||
|         List<ClientHttpRequestInterceptor> interceptors = restTemplate.getInterceptors(); | ||||
|         if (CollectionUtils.isEmpty(interceptors)) { | ||||
|             interceptors = new ArrayList<ClientHttpRequestInterceptor>(); | ||||
|         } | ||||
|         interceptors.add(new RestTemplateHeaderModifierInterceptor()); | ||||
|         restTemplate.setInterceptors(interceptors); | ||||
|         return restTemplate; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,42 @@ | ||||
| package com.baeldung.sampleapp.config; | ||||
| 
 | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.springframework.context.annotation.ComponentScan; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.http.converter.HttpMessageConverter; | ||||
| import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder; | ||||
| import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; | ||||
| import org.springframework.web.servlet.config.annotation.EnableWebMvc; | ||||
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||||
| 
 | ||||
| /* | ||||
|  * Please note that main web configuration is in src/main/webapp/WEB-INF/api-servlet.xml | ||||
|  */ | ||||
| @Configuration | ||||
| @EnableWebMvc | ||||
| @ComponentScan({ "com.baeldung.sampleapp.web" }) | ||||
| public class WebConfig implements WebMvcConfigurer { | ||||
| 
 | ||||
|     public WebConfig() { | ||||
|         super(); | ||||
|     } | ||||
| 
 | ||||
|     /* | ||||
|     @Override | ||||
|     public void configureMessageConverters(final List<HttpMessageConverter<?>> messageConverters) { | ||||
|         final Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder(); | ||||
|         builder.indentOutput(true) | ||||
|             .dateFormat(new SimpleDateFormat("dd-MM-yyyy hh:mm")); | ||||
|         messageConverters.add(new MappingJackson2HttpMessageConverter(builder.build())); | ||||
|         // messageConverters.add(new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build())); | ||||
| 
 | ||||
|         // messageConverters.add(new MappingJackson2HttpMessageConverter()); | ||||
|      | ||||
|         // messageConverters.add(new ProtobufHttpMessageConverter()); | ||||
|      | ||||
|     } | ||||
|      | ||||
|     */ | ||||
| } | ||||
| @ -0,0 +1,18 @@ | ||||
| package com.baeldung.sampleapp.interceptors; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| import org.springframework.http.HttpRequest; | ||||
| import org.springframework.http.client.ClientHttpRequestExecution; | ||||
| import org.springframework.http.client.ClientHttpRequestInterceptor; | ||||
| import org.springframework.http.client.ClientHttpResponse; | ||||
| 
 | ||||
| public class RestTemplateHeaderModifierInterceptor implements ClientHttpRequestInterceptor { | ||||
| 
 | ||||
|     @Override | ||||
|     public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { | ||||
|         ClientHttpResponse response = execution.execute(request, body);  | ||||
|         response.getHeaders().add("Foo", "bar"); | ||||
|         return response; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,28 @@ | ||||
| package com.baeldung.sampleapp.repository; | ||||
| 
 | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.web.dto.HeavyResource; | ||||
| import com.baeldung.sampleapp.web.dto.HeavyResourceAddressOnly; | ||||
| 
 | ||||
| public class HeavyResourceRepository { | ||||
| 
 | ||||
|     public void save(HeavyResource heavyResource) { | ||||
|     } | ||||
| 
 | ||||
|     public void save(HeavyResourceAddressOnly partialUpdate) { | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public void save(Map<String, Object> updates, String id) { | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public void save(HeavyResource heavyResource, String id) { | ||||
| 
 | ||||
|     } | ||||
| 
 | ||||
|     public void save(HeavyResourceAddressOnly partialUpdate, String id) { | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,47 @@ | ||||
| package com.baeldung.sampleapp.web.controller; | ||||
| 
 | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RequestParam; | ||||
| import org.springframework.web.bind.annotation.ResponseBody; | ||||
| 
 | ||||
| @Controller | ||||
| @RequestMapping(value = "/ex") | ||||
| public class BarMappingExamplesController { | ||||
| 
 | ||||
|     public BarMappingExamplesController() { | ||||
|         super(); | ||||
|     } | ||||
| 
 | ||||
|     // API | ||||
| 
 | ||||
|     // with @RequestParam | ||||
| 
 | ||||
|     @RequestMapping(value = "/bars") | ||||
|     @ResponseBody | ||||
|     public String getBarBySimplePathWithRequestParam(@RequestParam("id") final long id) { | ||||
|         return "Get a specific Bar with id=" + id; | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/bars", params = "id") | ||||
|     @ResponseBody | ||||
|     public String getBarBySimplePathWithExplicitRequestParam(@RequestParam("id") final long id) { | ||||
|         return "Get a specific Bar with id=" + id; | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/bars", params = { "id", "second" }) | ||||
|     @ResponseBody | ||||
|     public String getBarBySimplePathWithExplicitRequestParams(@RequestParam("id") final long id) { | ||||
|         return "Get a specific Bar with id=" + id; | ||||
|     } | ||||
| 
 | ||||
|     // with @PathVariable | ||||
| 
 | ||||
|     @RequestMapping(value = "/bars/{numericId:[\\d]+}") | ||||
|     @ResponseBody | ||||
|     public String getBarsBySimplePathWithPathVariable(@PathVariable final long numericId) { | ||||
|         return "Get a specific Bar with id=" + numericId; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,17 @@ | ||||
| package com.baeldung.sampleapp.web.controller; | ||||
| 
 | ||||
| import org.springframework.http.MediaType; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.web.dto.Company; | ||||
| 
 | ||||
| @RestController | ||||
| public class CompanyController { | ||||
| 
 | ||||
|     @RequestMapping(value = "/companyRest", produces = MediaType.APPLICATION_JSON_VALUE) | ||||
|     public Company getCompanyRest() { | ||||
|         final Company company = new Company(1, "Xpto"); | ||||
|         return company; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,85 @@ | ||||
| package com.baeldung.sampleapp.web.controller; | ||||
| 
 | ||||
| import java.util.concurrent.CompletableFuture; | ||||
| import java.util.function.Consumer; | ||||
| 
 | ||||
| import org.slf4j.Logger; | ||||
| import org.slf4j.LoggerFactory; | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.ui.Model; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import org.springframework.web.context.request.async.DeferredResult; | ||||
| 
 | ||||
| @RestController | ||||
| public class DeferredResultController { | ||||
| 
 | ||||
|     private final static Logger LOG = LoggerFactory.getLogger(DeferredResultController.class); | ||||
| 
 | ||||
|     @GetMapping("/async-deferredresult") | ||||
|     public DeferredResult<ResponseEntity<?>> handleReqDefResult(Model model) { | ||||
|         LOG.info("Received request"); | ||||
|         DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(); | ||||
| 
 | ||||
|         deferredResult.onCompletion(() -> LOG.info("Processing complete")); | ||||
| 
 | ||||
|         CompletableFuture.supplyAsync(() -> { | ||||
|             LOG.info("Processing in separate thread"); | ||||
|             try { | ||||
|                 Thread.sleep(6000); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|             return "OK"; | ||||
|         }) | ||||
|             .whenCompleteAsync((result, exc) -> deferredResult.setResult(ResponseEntity.ok(result))); | ||||
| 
 | ||||
|         LOG.info("Servlet thread freed"); | ||||
|         return deferredResult; | ||||
|     } | ||||
| 
 | ||||
|     @GetMapping("/process-blocking") | ||||
|     public ResponseEntity<?> handleReqSync(Model model) { | ||||
|         // ... | ||||
|         return ResponseEntity.ok("ok"); | ||||
|     } | ||||
| 
 | ||||
|     @GetMapping("/async-deferredresult-timeout") | ||||
|     public DeferredResult<ResponseEntity<?>> handleReqWithTimeouts(Model model) { | ||||
|         LOG.info("Received async request with a configured timeout"); | ||||
|         DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(500l); | ||||
|         deferredResult.onTimeout(() -> deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT) | ||||
|             .body("Request timeout occurred."))); | ||||
| 
 | ||||
|         CompletableFuture.supplyAsync(() -> { | ||||
|             LOG.info("Processing in separate thread"); | ||||
|             try { | ||||
|                 Thread.sleep(6000); | ||||
|             } catch (InterruptedException e) { | ||||
|                 e.printStackTrace(); | ||||
|             } | ||||
|             return "error"; | ||||
|         }) | ||||
|             .whenCompleteAsync((result, exc) -> deferredResult.setResult(ResponseEntity.ok(result))); | ||||
|         LOG.info("servlet thread freed"); | ||||
|         return deferredResult; | ||||
|     } | ||||
| 
 | ||||
|     @GetMapping("/async-deferredresult-error") | ||||
|     public DeferredResult<ResponseEntity<?>> handleAsyncFailedRequest(Model model) { | ||||
|         LOG.info("Received async request with a configured error handler"); | ||||
|         DeferredResult<ResponseEntity<?>> deferredResult = new DeferredResult<>(); | ||||
|         deferredResult.onError(new Consumer<Throwable>() { | ||||
|             @Override | ||||
|             public void accept(Throwable t) { | ||||
|                 deferredResult.setErrorResult(ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) | ||||
|                     .body("An error occurred.")); | ||||
|             } | ||||
| 
 | ||||
|         }); | ||||
|         LOG.info("servlet thread freed"); | ||||
|         return deferredResult; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,42 @@ | ||||
| package com.baeldung.sampleapp.web.controller; | ||||
| 
 | ||||
| 
 | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import org.springframework.http.MediaType; | ||||
| import org.springframework.http.ResponseEntity; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestBody; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMethod; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.repository.HeavyResourceRepository; | ||||
| import com.baeldung.sampleapp.web.dto.HeavyResource; | ||||
| import com.baeldung.sampleapp.web.dto.HeavyResourceAddressOnly; | ||||
| 
 | ||||
| @RestController | ||||
| public class HeavyResourceController { | ||||
| 
 | ||||
|     private HeavyResourceRepository heavyResourceRepository = new HeavyResourceRepository(); | ||||
| 
 | ||||
|     @RequestMapping(value = "/heavyresource/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE) | ||||
|     public ResponseEntity<?> saveResource(@RequestBody HeavyResource heavyResource, @PathVariable("id") String id) { | ||||
|         heavyResourceRepository.save(heavyResource, id); | ||||
|         return ResponseEntity.ok("resource saved"); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/heavyresource/{id}", method = RequestMethod.PATCH, consumes = MediaType.APPLICATION_JSON_VALUE) | ||||
|     public ResponseEntity<?> partialUpdateName(@RequestBody HeavyResourceAddressOnly partialUpdate, @PathVariable("id") String id) { | ||||
|         heavyResourceRepository.save(partialUpdate, id); | ||||
|         return ResponseEntity.ok("resource address updated"); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/heavyresource2/{id}", method = RequestMethod.PATCH, consumes = MediaType.APPLICATION_JSON_VALUE) | ||||
|     public ResponseEntity<?> partialUpdateGeneric(@RequestBody Map<String, Object> updates, | ||||
|                                                   @PathVariable("id") String id) { | ||||
|         heavyResourceRepository.save(updates, id); | ||||
|         return ResponseEntity.ok("resource updated"); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,39 @@ | ||||
| package com.baeldung.sampleapp.web.controller; | ||||
| 
 | ||||
| import java.util.Date; | ||||
| 
 | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.web.dto.Item; | ||||
| import com.baeldung.sampleapp.web.dto.ItemManager; | ||||
| import com.baeldung.sampleapp.web.dto.Views; | ||||
| import com.fasterxml.jackson.annotation.JsonView; | ||||
| 
 | ||||
| @RestController | ||||
| public class ItemController { | ||||
| 
 | ||||
|     @JsonView(Views.Public.class) | ||||
|     @RequestMapping("/items/{id}") | ||||
|     public Item getItemPublic(@PathVariable final int id) { | ||||
|         return ItemManager.getById(id); | ||||
|     } | ||||
| 
 | ||||
|     @JsonView(Views.Internal.class) | ||||
|     @RequestMapping("/items/internal/{id}") | ||||
|     public Item getItemInternal(@PathVariable final int id) { | ||||
|         return ItemManager.getById(id); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping("/date") | ||||
|     public Date getCurrentDate() throws Exception { | ||||
|         return new Date(); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping("/delay/{seconds}") | ||||
|     public void getCurrentTime(@PathVariable final int seconds) throws Exception { | ||||
| 
 | ||||
|         Thread.sleep(seconds * 1000); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,85 @@ | ||||
| package com.baeldung.sampleapp.web.controller; | ||||
| 
 | ||||
| import java.util.Collection; | ||||
| import java.util.HashMap; | ||||
| import java.util.Map; | ||||
| 
 | ||||
| import javax.servlet.http.HttpServletResponse; | ||||
| 
 | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestBody; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMethod; | ||||
| import org.springframework.web.bind.annotation.ResponseBody; | ||||
| import org.springframework.web.bind.annotation.ResponseStatus; | ||||
| import org.springframework.web.servlet.support.ServletUriComponentsBuilder; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.web.dto.Foo; | ||||
| import com.baeldung.sampleapp.web.exception.ResourceNotFoundException; | ||||
| 
 | ||||
| @Controller | ||||
| @RequestMapping(value = "/foos") | ||||
| public class MyFooController { | ||||
| 
 | ||||
|     private final Map<Long, Foo> myfoos; | ||||
| 
 | ||||
|     public MyFooController() { | ||||
|         super(); | ||||
|         myfoos = new HashMap<Long, Foo>(); | ||||
|         myfoos.put(1L, new Foo(1L, "sample foo")); | ||||
|     } | ||||
| 
 | ||||
|     // API - read | ||||
| 
 | ||||
|     @RequestMapping(method = RequestMethod.GET, produces = { "application/json" }) | ||||
|     @ResponseBody | ||||
|     public Collection<Foo> findAll() { | ||||
|         return myfoos.values(); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(method = RequestMethod.GET, value = "/{id}", produces = { "application/json" }) | ||||
|     @ResponseBody | ||||
|     public Foo findById(@PathVariable final long id) { | ||||
|         final Foo foo = myfoos.get(id); | ||||
|         if (foo == null) { | ||||
|             throw new ResourceNotFoundException(); | ||||
|         } | ||||
|         return foo; | ||||
|     } | ||||
| 
 | ||||
|     // API - write | ||||
| 
 | ||||
|     @RequestMapping(method = RequestMethod.PUT, value = "/{id}") | ||||
|     @ResponseStatus(HttpStatus.OK) | ||||
|     @ResponseBody | ||||
|     public Foo updateFoo(@PathVariable("id") final long id, @RequestBody final Foo foo) { | ||||
|         myfoos.put(id, foo); | ||||
|         return foo; | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(method = RequestMethod.PATCH, value = "/{id}") | ||||
|     @ResponseStatus(HttpStatus.OK) | ||||
|     public void updateFoo2(@PathVariable("id") final long id, @RequestBody final Foo foo) { | ||||
|         myfoos.put(id, foo); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(method = RequestMethod.POST) | ||||
|     @ResponseStatus(HttpStatus.CREATED) | ||||
|     @ResponseBody | ||||
|     public Foo createFoo(@RequestBody final Foo foo, HttpServletResponse response) { | ||||
|         myfoos.put(foo.getId(), foo); | ||||
|         response.setHeader("Location", ServletUriComponentsBuilder.fromCurrentRequest() | ||||
|             .path("/" + foo.getId()) | ||||
|             .toUriString()); | ||||
|         return foo; | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") | ||||
|     @ResponseStatus(HttpStatus.OK) | ||||
|     public void deleteById(@PathVariable final long id) { | ||||
|         myfoos.remove(id); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,33 @@ | ||||
| package com.baeldung.sampleapp.web.controller; | ||||
| 
 | ||||
| import java.util.ArrayList; | ||||
| import java.util.List; | ||||
| 
 | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.http.MediaType; | ||||
| import org.springframework.web.bind.annotation.GetMapping; | ||||
| import org.springframework.web.bind.annotation.PostMapping; | ||||
| import org.springframework.web.bind.annotation.ResponseBody; | ||||
| import org.springframework.web.bind.annotation.ResponseStatus; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.web.dto.PactDto; | ||||
| 
 | ||||
| @RestController | ||||
| public class PactController { | ||||
| 
 | ||||
|     List<PactDto> pacts = new ArrayList<>(); | ||||
| 
 | ||||
|     @GetMapping(value = "/pact", produces = MediaType.APPLICATION_JSON_VALUE) | ||||
|     @ResponseBody | ||||
|     public PactDto getPact() { | ||||
|         return new PactDto(true, "tom"); | ||||
|     } | ||||
| 
 | ||||
|     @PostMapping("/pact") | ||||
|     @ResponseStatus(HttpStatus.CREATED) | ||||
|     public void createPact(PactDto pact) { | ||||
|         pacts.add(pact); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,74 @@ | ||||
| package com.baeldung.sampleapp.web.controller; | ||||
| 
 | ||||
| import java.io.BufferedOutputStream; | ||||
| import java.io.File; | ||||
| import java.io.FileOutputStream; | ||||
| import java.text.DateFormat; | ||||
| import java.text.SimpleDateFormat; | ||||
| import java.util.Date; | ||||
| 
 | ||||
| import org.springframework.web.bind.annotation.RequestBody; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMethod; | ||||
| import org.springframework.web.bind.annotation.RequestParam; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| import org.springframework.web.multipart.MultipartFile; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.web.dto.Foo; | ||||
| 
 | ||||
| // used to test HttpClientPostingTest | ||||
| @RestController | ||||
| public class SimplePostController { | ||||
| 
 | ||||
|     @RequestMapping(value = "/users", method = RequestMethod.POST) | ||||
|     public String postUser(@RequestParam final String username, @RequestParam final String password) { | ||||
|         return "Success" + username; | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/users/detail", method = RequestMethod.POST) | ||||
|     public String postUserDetail(@RequestBody final Foo entity) { | ||||
|         return "Success" + entity.getId(); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/users/multipart", method = RequestMethod.POST) | ||||
|     public String uploadFile(@RequestParam final String username, @RequestParam final String password, @RequestParam("file") final MultipartFile file) { | ||||
|         if (!file.isEmpty()) { | ||||
|             try { | ||||
|                 final DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); | ||||
|                 final String fileName = dateFormat.format(new Date()); | ||||
|                 final File fileServer = new File(fileName); | ||||
|                 fileServer.createNewFile(); | ||||
|                 final byte[] bytes = file.getBytes(); | ||||
|                 final BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer)); | ||||
|                 stream.write(bytes); | ||||
|                 stream.close(); | ||||
|                 return "You successfully uploaded " + username; | ||||
|             } catch (final Exception e) { | ||||
|                 return "You failed to upload " + e.getMessage(); | ||||
|             } | ||||
|         } else { | ||||
|             return "You failed to upload because the file was empty."; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/users/upload", method = RequestMethod.POST) | ||||
|     public String postMultipart(@RequestParam("file") final MultipartFile file) { | ||||
|         if (!file.isEmpty()) { | ||||
|             try { | ||||
|                 final DateFormat dateFormat = new SimpleDateFormat("yyyy_MM_dd_HH.mm.ss"); | ||||
|                 final String fileName = dateFormat.format(new Date()); | ||||
|                 final File fileServer = new File(fileName); | ||||
|                 fileServer.createNewFile(); | ||||
|                 final byte[] bytes = file.getBytes(); | ||||
|                 final BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fileServer)); | ||||
|                 stream.write(bytes); | ||||
|                 stream.close(); | ||||
|                 return "You successfully uploaded "; | ||||
|             } catch (final Exception e) { | ||||
|                 return "You failed to upload " + e.getMessage(); | ||||
|             } | ||||
|         } else { | ||||
|             return "You failed to upload because the file was empty."; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,25 @@ | ||||
| package com.baeldung.sampleapp.web.controller.mediatypes; | ||||
| 
 | ||||
| import org.springframework.web.bind.annotation.PathVariable; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMethod; | ||||
| import org.springframework.web.bind.annotation.ResponseBody; | ||||
| import org.springframework.web.bind.annotation.RestController; | ||||
| 
 | ||||
| import com.baeldung.sampleapp.web.dto.BaeldungItem; | ||||
| import com.baeldung.sampleapp.web.dto.BaeldungItemV2; | ||||
| 
 | ||||
| @RestController | ||||
| @RequestMapping(value = "/", produces = "application/vnd.baeldung.api.v1+json") | ||||
| public class CustomMediaTypeController { | ||||
| 
 | ||||
|     @RequestMapping(method = RequestMethod.GET, value = "/public/api/items/{id}", produces = "application/vnd.baeldung.api.v1+json") | ||||
|     public @ResponseBody BaeldungItem getItem(@PathVariable("id") String id) { | ||||
|         return new BaeldungItem("itemId1"); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(method = RequestMethod.GET, value = "/public/api/items/{id}", produces = "application/vnd.baeldung.api.v2+json") | ||||
|     public @ResponseBody BaeldungItemV2 getItemSecondAPIVersion(@PathVariable("id") String id) { | ||||
|         return new BaeldungItemV2("itemName"); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,68 @@ | ||||
| package com.baeldung.sampleapp.web.controller.redirect; | ||||
| 
 | ||||
| import javax.servlet.http.HttpServletRequest; | ||||
| 
 | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.stereotype.Controller; | ||||
| import org.springframework.ui.ModelMap; | ||||
| import org.springframework.web.bind.annotation.ModelAttribute; | ||||
| import org.springframework.web.bind.annotation.RequestMapping; | ||||
| import org.springframework.web.bind.annotation.RequestMethod; | ||||
| import org.springframework.web.servlet.ModelAndView; | ||||
| import org.springframework.web.servlet.View; | ||||
| import org.springframework.web.servlet.mvc.support.RedirectAttributes; | ||||
| import org.springframework.web.servlet.view.RedirectView; | ||||
| 
 | ||||
| @Controller | ||||
| @RequestMapping("/") | ||||
| public class RedirectController { | ||||
| 
 | ||||
|     @RequestMapping(value = "/redirectWithXMLConfig", method = RequestMethod.GET) | ||||
|     public ModelAndView redirectWithUsingXMLConfig(final ModelMap model) { | ||||
|         model.addAttribute("attribute", "redirectWithXMLConfig"); | ||||
|         return new ModelAndView("RedirectedUrl", model); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/redirectWithRedirectPrefix", method = RequestMethod.GET) | ||||
|     public ModelAndView redirectWithUsingRedirectPrefix(final ModelMap model) { | ||||
|         model.addAttribute("attribute", "redirectWithRedirectPrefix"); | ||||
|         return new ModelAndView("redirect:/redirectedUrl", model); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/redirectWithRedirectAttributes", method = RequestMethod.GET) | ||||
|     public RedirectView redirectWithRedirectAttributes(final RedirectAttributes redirectAttributes) { | ||||
|         redirectAttributes.addFlashAttribute("flashAttribute", "redirectWithRedirectAttributes"); | ||||
|         redirectAttributes.addAttribute("attribute", "redirectWithRedirectAttributes"); | ||||
|         return new RedirectView("redirectedUrl"); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/redirectWithRedirectView", method = RequestMethod.GET) | ||||
|     public RedirectView redirectWithUsingRedirectView(final ModelMap model) { | ||||
|         model.addAttribute("attribute", "redirectWithRedirectView"); | ||||
|         return new RedirectView("redirectedUrl"); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/forwardWithForwardPrefix", method = RequestMethod.GET) | ||||
|     public ModelAndView forwardWithUsingForwardPrefix(final ModelMap model) { | ||||
|         model.addAttribute("attribute", "redirectWithForwardPrefix"); | ||||
|         return new ModelAndView("forward:/redirectedUrl", model); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/redirectedUrl", method = RequestMethod.GET) | ||||
|     public ModelAndView redirection(final ModelMap model, @ModelAttribute("flashAttribute") final Object flashAttribute) { | ||||
|         model.addAttribute("redirectionAttribute", flashAttribute); | ||||
|         return new ModelAndView("redirection", model); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/redirectPostToPost", method = RequestMethod.POST) | ||||
|     public ModelAndView redirectPostToPost(HttpServletRequest request) { | ||||
|         request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, HttpStatus.TEMPORARY_REDIRECT); | ||||
|         return new ModelAndView("redirect:/redirectedPostToPost"); | ||||
|     } | ||||
| 
 | ||||
|     @RequestMapping(value = "/redirectedPostToPost", method = RequestMethod.POST) | ||||
|     public ModelAndView redirectedPostToPost() { | ||||
|         return new ModelAndView("redirection"); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,13 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| public class BaeldungItem { | ||||
|     private final String itemId; | ||||
| 
 | ||||
|     public BaeldungItem(String itemId) { | ||||
|         this.itemId = itemId; | ||||
|     } | ||||
| 
 | ||||
|     public String getItemId() { | ||||
|         return itemId; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,14 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| 
 | ||||
| public class BaeldungItemV2 { | ||||
|     private final String itemName; | ||||
| 
 | ||||
|     public BaeldungItemV2(String itemName) { | ||||
|         this.itemName = itemName; | ||||
|     } | ||||
| 
 | ||||
|     public String getItemName() { | ||||
|         return itemName; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,38 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| public class Company { | ||||
| 
 | ||||
|     private long id; | ||||
|     private String name; | ||||
| 
 | ||||
|     public Company() { | ||||
|         super(); | ||||
|     } | ||||
| 
 | ||||
|     public Company(final long id, final String name) { | ||||
|         this.id = id; | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(final String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public long getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(final long id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public String toString() { | ||||
|         return "Company [id=" + id + ", name=" + name + "]"; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,42 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| public class Foo { | ||||
|     private long id; | ||||
|     private String name; | ||||
| 
 | ||||
|     public Foo() { | ||||
|         super(); | ||||
|     } | ||||
| 
 | ||||
|     public Foo(final String name) { | ||||
|         super(); | ||||
| 
 | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public Foo(final long id, final String name) { | ||||
|         super(); | ||||
| 
 | ||||
|         this.id = id; | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     // API | ||||
| 
 | ||||
|     public long getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(final long id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(final String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,62 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| 
 | ||||
| public class HeavyResource { | ||||
|     private Integer id; | ||||
|     private String name; | ||||
|     private String surname; | ||||
|     private Integer age; | ||||
|     private String address; | ||||
| 
 | ||||
| 
 | ||||
|     public HeavyResource() { | ||||
|     } | ||||
| 
 | ||||
|     public HeavyResource(Integer id, String name, String surname, Integer age, String address) { | ||||
|         this.id = id; | ||||
|         this.name = name; | ||||
|         this.surname = surname; | ||||
|         this.age = age; | ||||
|         this.address = address; | ||||
|     } | ||||
| 
 | ||||
|     public Integer getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(Integer id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public String getSurname() { | ||||
|         return surname; | ||||
|     } | ||||
| 
 | ||||
|     public void setSurname(String surname) { | ||||
|         this.surname = surname; | ||||
|     } | ||||
| 
 | ||||
|     public Integer getAge() { | ||||
|         return age; | ||||
|     } | ||||
| 
 | ||||
|     public void setAge(Integer age) { | ||||
|         this.age = age; | ||||
|     } | ||||
| 
 | ||||
|     public String getAddress() { | ||||
|         return address; | ||||
|     } | ||||
| 
 | ||||
|     public void setAddress(String address) { | ||||
|         this.address = address; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,31 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| 
 | ||||
| public class HeavyResourceAddressOnly { | ||||
|     private Integer id; | ||||
|     private String address; | ||||
| 
 | ||||
|     public HeavyResourceAddressOnly() { | ||||
|     } | ||||
| 
 | ||||
|     public HeavyResourceAddressOnly(Integer id, String address) { | ||||
|         this.id = id; | ||||
|         this.address = address; | ||||
|     } | ||||
| 
 | ||||
|     public Integer getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(Integer id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public String getAddress() { | ||||
|         return address; | ||||
|     } | ||||
| 
 | ||||
|     public void setAddress(String address) { | ||||
|         this.address = address; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,31 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| 
 | ||||
| public class HeavyResourceAddressPartialUpdate { | ||||
|     private Integer id; | ||||
|     private String address; | ||||
| 
 | ||||
|     public HeavyResourceAddressPartialUpdate() { | ||||
|     } | ||||
| 
 | ||||
|     public HeavyResourceAddressPartialUpdate(Integer id, String address) { | ||||
|         this.id = id; | ||||
|         this.address = address; | ||||
|     } | ||||
| 
 | ||||
|     public Integer getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public void setId(Integer id) { | ||||
|         this.id = id; | ||||
|     } | ||||
| 
 | ||||
|     public String getAddress() { | ||||
|         return address; | ||||
|     } | ||||
| 
 | ||||
|     public void setAddress(String address) { | ||||
|         this.address = address; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,36 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| import com.fasterxml.jackson.annotation.JsonView; | ||||
| 
 | ||||
| public class Item { | ||||
|     @JsonView(Views.Public.class) | ||||
|     public int id; | ||||
| 
 | ||||
|     @JsonView(Views.Public.class) | ||||
|     public String itemName; | ||||
| 
 | ||||
|     @JsonView(Views.Internal.class) | ||||
|     public String ownerName; | ||||
| 
 | ||||
|     public Item() { | ||||
|         super(); | ||||
|     } | ||||
| 
 | ||||
|     public Item(final int id, final String itemName, final String ownerName) { | ||||
|         this.id = id; | ||||
|         this.itemName = itemName; | ||||
|         this.ownerName = ownerName; | ||||
|     } | ||||
| 
 | ||||
|     public int getId() { | ||||
|         return id; | ||||
|     } | ||||
| 
 | ||||
|     public String getItemName() { | ||||
|         return itemName; | ||||
|     } | ||||
| 
 | ||||
|     public String getOwnerName() { | ||||
|         return ownerName; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,9 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| public class ItemManager { | ||||
| 
 | ||||
|     public static Item getById(final int id) { | ||||
|         final Item item = new Item(2, "book", "John"); | ||||
|         return item; | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,33 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| public class PactDto { | ||||
| 
 | ||||
|     private boolean condition; | ||||
|     private String name; | ||||
| 
 | ||||
|     public PactDto() { | ||||
|     } | ||||
| 
 | ||||
|     public PactDto(boolean condition, String name) { | ||||
|         super(); | ||||
|         this.condition = condition; | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
|     public boolean isCondition() { | ||||
|         return condition; | ||||
|     } | ||||
| 
 | ||||
|     public void setCondition(boolean condition) { | ||||
|         this.condition = condition; | ||||
|     } | ||||
| 
 | ||||
|     public String getName() { | ||||
|         return name; | ||||
|     } | ||||
| 
 | ||||
|     public void setName(String name) { | ||||
|         this.name = name; | ||||
|     } | ||||
| 
 | ||||
| } | ||||
| @ -0,0 +1,9 @@ | ||||
| package com.baeldung.sampleapp.web.dto; | ||||
| 
 | ||||
| public class Views { | ||||
|     public static class Public { | ||||
|     } | ||||
| 
 | ||||
|     public static class Internal extends Public { | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,8 @@ | ||||
| package com.baeldung.sampleapp.web.exception; | ||||
| 
 | ||||
| import org.springframework.http.HttpStatus; | ||||
| import org.springframework.web.bind.annotation.ResponseStatus; | ||||
| 
 | ||||
| @ResponseStatus(value = HttpStatus.NOT_FOUND) | ||||
| public class ResourceNotFoundException extends RuntimeException { | ||||
| } | ||||
| @ -11,6 +11,7 @@ import org.springframework.context.annotation.ComponentScan; | ||||
| import org.springframework.web.context.ContextLoaderListener; | ||||
| import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; | ||||
| import org.springframework.web.servlet.DispatcherServlet; | ||||
| import org.springframework.context.annotation.PropertySource; | ||||
| 
 | ||||
| import com.baeldung.web.log.config.CustomeRequestLoggingFilter; | ||||
| 
 | ||||
| @ -18,6 +19,7 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer | ||||
| 
 | ||||
| @EnableAutoConfiguration | ||||
| @ComponentScan("com.baeldung.web.log") | ||||
| @PropertySource("application-log.properties") | ||||
| @SpringBootApplication | ||||
| public class Application extends SpringBootServletInitializer { | ||||
| 
 | ||||
| @ -0,0 +1,2 @@ | ||||
| server.port=8082 | ||||
| server.servlet.context-path=/spring-rest | ||||
| @ -20,3 +20,4 @@ spring.application.name=spring-boot-management | ||||
| server.port=8081 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -7,14 +7,17 @@ import org.junit.Test; | ||||
| import org.junit.runner.RunWith; | ||||
| import org.springframework.boot.test.context.SpringBootTest; | ||||
| import org.springframework.boot.test.web.client.TestRestTemplate; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.boot.web.server.LocalServerPort; | ||||
| import org.springframework.test.context.junit4.SpringRunner; | ||||
| import org.springframework.security.config.annotation.web.builders.HttpSecurity; | ||||
| import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; | ||||
| 
 | ||||
| import com.baeldung.web.log.app.Application; | ||||
| import com.baeldung.web.log.data.TaxiRide; | ||||
| 
 | ||||
| @RunWith(SpringRunner.class) | ||||
| @SpringBootTest(classes = { Application.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | ||||
| @SpringBootTest(classes = { Application.class, TaxiFareControllerIntegrationTest.SecurityConfig.class}, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) | ||||
| public class TaxiFareControllerIntegrationTest { | ||||
|      | ||||
|     @LocalServerPort | ||||
| @ -22,7 +25,8 @@ public class TaxiFareControllerIntegrationTest { | ||||
|      | ||||
|     @Test | ||||
|     public void givenRequest_whenFetchTaxiFareRateCard_thanOK() { | ||||
|          | ||||
| 
 | ||||
|         System.out.println(port); | ||||
|         String URL = "http://localhost:" + port + "/spring-rest"; | ||||
|         TestRestTemplate testRestTemplate = new TestRestTemplate(); | ||||
|         TaxiRide taxiRide = new TaxiRide(true, 10l); | ||||
| @ -32,4 +36,17 @@ public class TaxiFareControllerIntegrationTest { | ||||
|        | ||||
|         assertThat(fare, equalTo("200")); | ||||
|     } | ||||
| 
 | ||||
|     @Configuration | ||||
|     static class SecurityConfig extends WebSecurityConfigurerAdapter { | ||||
|         @Override | ||||
|         protected void configure(HttpSecurity http) throws Exception { | ||||
|             System.out.println("security being set"); | ||||
|             http | ||||
|                     .authorizeRequests() | ||||
|                     .anyRequest().permitAll() | ||||
|                     .and() | ||||
|                     .csrf().disable(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -10,7 +10,6 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com | ||||
| 
 | ||||
| ### Relevant Articles:  | ||||
| - [Integration Testing with the Maven Cargo plugin](https://www.baeldung.com/integration-testing-with-the-maven-cargo-plugin) | ||||
| - [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring) | ||||
| - [Metrics for your Spring REST API](https://www.baeldung.com/spring-rest-api-metrics) | ||||
| 
 | ||||
| ### Build the Project | ||||
|  | ||||
| @ -9,5 +9,4 @@ This module contains articles about REST APIs in Spring | ||||
| - [Spring RequestMapping](https://www.baeldung.com/spring-requestmapping) | ||||
| - [Spring and Apache FileUpload](https://www.baeldung.com/spring-apache-file-upload) | ||||
| - [Test a REST API with curl](https://www.baeldung.com/curl-rest) | ||||
| - [CORS with Spring](https://www.baeldung.com/spring-cors) | ||||
| - [Best Practices for REST API Error Handling](https://www.baeldung.com/rest-api-error-handling-best-practices) | ||||
| - [Best Practices for REST API Error Handling](https://www.baeldung.com/rest-api-error-handling-best-practices) | ||||
							
								
								
									
										2
									
								
								spring-rest/.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								spring-rest/.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -4,7 +4,7 @@ | ||||
| /target | ||||
| /neoDb* | ||||
| /data | ||||
| /src/main/webapp/WEB-INF/classes | ||||
| /spring-boot-runtime/src/main/webapp/WEB-INF/classes | ||||
| */META-INF/* | ||||
| 
 | ||||
| # Packaged files # | ||||
|  | ||||
| @ -12,9 +12,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring | ||||
| - [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) | ||||
| - [A Custom Media Type for a Spring REST API](https://www.baeldung.com/spring-rest-custom-media-type) | ||||
| - [HTTP PUT vs HTTP PATCH in a REST API](https://www.baeldung.com/http-put-patch-difference-spring) | ||||
| - [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging) | ||||
| - [How to Change the Default Port in Spring Boot](https://www.baeldung.com/spring-boot-change-port) | ||||
| - [Guide to DeferredResult in Spring](https://www.baeldung.com/spring-deferred-result) | ||||
| - [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) | ||||
| - [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) | ||||
| - [Download an Image or a File with Spring MVC](https://www.baeldung.com/spring-controller-return-image-file) | ||||
|  | ||||
| @ -5,17 +5,13 @@ import org.junit.runner.RunWith; | ||||
| import org.springframework.boot.test.context.SpringBootTest; | ||||
| import org.springframework.test.context.junit4.SpringRunner; | ||||
| 
 | ||||
| import com.baeldung.changeport.CustomApplication; | ||||
| import com.baeldung.produceimage.ImageApplication; | ||||
| import com.baeldung.propertyeditor.PropertyEditorApplication; | ||||
| import com.baeldung.responseheaders.ResponseHeadersApplication; | ||||
| import com.baeldung.sampleapp.config.MainApplication; | ||||
| import com.baeldung.web.log.app.Application; | ||||
| 
 | ||||
| @RunWith(SpringRunner.class) | ||||
| @SpringBootTest(classes = { CustomApplication.class, ImageApplication.class, PropertyEditorApplication.class, | ||||
| 		ResponseHeadersApplication.class, Application.class, com.baeldung.web.upload.app.UploadApplication.class, | ||||
| 		MainApplication.class}) | ||||
| @SpringBootTest(classes = { ImageApplication.class, | ||||
| 		ResponseHeadersApplication.class, com.baeldung.web.upload.app.UploadApplication.class, | ||||
| 		}) | ||||
| public class SpringContextIntegrationTest { | ||||
| 
 | ||||
|     @Test | ||||
|  | ||||
| @ -5,17 +5,14 @@ import org.junit.runner.RunWith; | ||||
| import org.springframework.boot.test.context.SpringBootTest; | ||||
| import org.springframework.test.context.junit4.SpringRunner; | ||||
| 
 | ||||
| import com.baeldung.changeport.CustomApplication; | ||||
| import com.baeldung.produceimage.ImageApplication; | ||||
| import com.baeldung.propertyeditor.PropertyEditorApplication; | ||||
| import com.baeldung.responseheaders.ResponseHeadersApplication; | ||||
| import com.baeldung.sampleapp.config.MainApplication; | ||||
| import com.baeldung.web.log.app.Application; | ||||
| 
 | ||||
| @RunWith(SpringRunner.class) | ||||
| @SpringBootTest(classes = { CustomApplication.class, ImageApplication.class, PropertyEditorApplication.class, | ||||
| 		ResponseHeadersApplication.class, Application.class, com.baeldung.web.upload.app.UploadApplication.class, | ||||
| 		MainApplication.class}) | ||||
| @SpringBootTest(classes = { ImageApplication.class, | ||||
| 		ResponseHeadersApplication.class, | ||||
|         com.baeldung.web.upload.app.UploadApplication.class, | ||||
| 		}) | ||||
| public class SpringContextTest { | ||||
| 
 | ||||
|     @Test | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user