Merge pull request #12474 from amitiw4u/BAEL-5297_ExceptionHandling
Bael 5297 exception handling
This commit is contained in:
		
						commit
						e17700100f
					
				| @ -52,6 +52,7 @@ | |||||||
|         <module>spring-cloud-bus</module> |         <module>spring-cloud-bus</module> | ||||||
|         <module>spring-cloud-data-flow</module> |         <module>spring-cloud-data-flow</module> | ||||||
|         <module>spring-cloud-sleuth</module> |         <module>spring-cloud-sleuth</module> | ||||||
|  |         <module>spring-cloud-openfeign-2</module> | ||||||
|     </modules> |     </modules> | ||||||
| 
 | 
 | ||||||
|     <build> |     <build> | ||||||
|  | |||||||
							
								
								
									
										1
									
								
								spring-cloud-modules/spring-cloud-openfeign-2/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								spring-cloud-modules/spring-cloud-openfeign-2/README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1 @@ | |||||||
|  | ### Relevant Articles: | ||||||
							
								
								
									
										64
									
								
								spring-cloud-modules/spring-cloud-openfeign-2/pom.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								spring-cloud-modules/spring-cloud-openfeign-2/pom.xml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||||
|  |     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||||
|  |     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||||
|  |     <modelVersion>4.0.0</modelVersion> | ||||||
|  |     <groupId>com.baeldung.cloud</groupId> | ||||||
|  |     <artifactId>spring-cloud-openfeign-2</artifactId> | ||||||
|  |     <name>spring-cloud-openfeign-2</name> | ||||||
|  |     <description>OpenFeign project for Spring Boot</description> | ||||||
|  | 
 | ||||||
|  |     <parent> | ||||||
|  |         <groupId>com.baeldung</groupId> | ||||||
|  |         <artifactId>parent-boot-2</artifactId> | ||||||
|  |         <version>0.0.1-SNAPSHOT</version> | ||||||
|  |         <relativePath>../../parent-boot-2</relativePath> | ||||||
|  |     </parent> | ||||||
|  | 
 | ||||||
|  |     <dependencyManagement> | ||||||
|  |         <dependencies> | ||||||
|  |             <dependency> | ||||||
|  |                 <groupId>org.springframework.cloud</groupId> | ||||||
|  |                 <artifactId>spring-cloud-dependencies</artifactId> | ||||||
|  |                 <version>${spring-cloud.version}</version> | ||||||
|  |                 <type>pom</type> | ||||||
|  |                 <scope>import</scope> | ||||||
|  |             </dependency> | ||||||
|  |         </dependencies> | ||||||
|  |     </dependencyManagement> | ||||||
|  | 
 | ||||||
|  |     <dependencies> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.springframework.cloud</groupId> | ||||||
|  |             <artifactId>spring-cloud-starter-openfeign</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>io.github.openfeign</groupId> | ||||||
|  |             <artifactId>feign-okhttp</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.springframework.boot</groupId> | ||||||
|  |             <artifactId>spring-boot-starter-web</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>io.github.openfeign.form</groupId> | ||||||
|  |             <artifactId>feign-form</artifactId> | ||||||
|  |             <version>${feign-form.version}</version> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>io.github.openfeign.form</groupId> | ||||||
|  |             <artifactId>feign-form-spring</artifactId> | ||||||
|  |         </dependency> | ||||||
|  |         <dependency> | ||||||
|  |             <groupId>org.springframework.boot</groupId> | ||||||
|  |             <artifactId>spring-boot-starter-test</artifactId> | ||||||
|  |             <scope>test</scope> | ||||||
|  |         </dependency> | ||||||
|  |     </dependencies> | ||||||
|  | 
 | ||||||
|  |     <properties> | ||||||
|  |         <spring-cloud.version>2021.0.0</spring-cloud.version> | ||||||
|  |         <feign-form.version>3.8.0</feign-form.version> | ||||||
|  |     </properties> | ||||||
|  | 
 | ||||||
|  | </project> | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | package com.baeldung.cloud.openfeign; | ||||||
|  | 
 | ||||||
|  | import org.springframework.boot.SpringApplication; | ||||||
|  | import org.springframework.boot.autoconfigure.SpringBootApplication; | ||||||
|  | import org.springframework.cloud.openfeign.EnableFeignClients; | ||||||
|  | 
 | ||||||
|  | @SpringBootApplication | ||||||
|  | @EnableFeignClients | ||||||
|  | public class ExampleApplication { | ||||||
|  | 
 | ||||||
|  |     public static void main(String[] args) { | ||||||
|  |         SpringApplication.run(ExampleApplication.class, args); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -0,0 +1,21 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.exception; | ||||||
|  | 
 | ||||||
|  | public class BadRequestException extends Exception { | ||||||
|  | 
 | ||||||
|  |     public BadRequestException() { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public BadRequestException(String message) { | ||||||
|  |         super(message); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public BadRequestException(Throwable cause) { | ||||||
|  |         super(cause); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public String toString() { | ||||||
|  |         return "BadRequestException: " + getMessage(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,18 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.exception; | ||||||
|  | 
 | ||||||
|  | public class NotFoundException extends Exception { | ||||||
|  | 
 | ||||||
|  |     public NotFoundException(String message) { | ||||||
|  |         super(message); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public NotFoundException(Throwable cause) { | ||||||
|  |         super(cause); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public String toString() { | ||||||
|  |         return "NotFoundException: " + getMessage(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,55 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.config; | ||||||
|  | 
 | ||||||
|  | public class ExceptionMessage { | ||||||
|  |     private String timestamp; | ||||||
|  |     private int status; | ||||||
|  |     private String error; | ||||||
|  |     private String message; | ||||||
|  |     private String path; | ||||||
|  | 
 | ||||||
|  |     public String getTimestamp() { | ||||||
|  |         return timestamp; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setTimestamp(String timestamp) { | ||||||
|  |         this.timestamp = timestamp; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public int getStatus() { | ||||||
|  |         return status; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setStatus(int status) { | ||||||
|  |         this.status = status; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getError() { | ||||||
|  |         return error; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setError(String error) { | ||||||
|  |         this.error = error; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getMessage() { | ||||||
|  |         return message; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setMessage(String message) { | ||||||
|  |         this.message = message; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getPath() { | ||||||
|  |         return path; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setPath(String path) { | ||||||
|  |         this.path = path; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public String toString() { | ||||||
|  |         return "ExceptionMessage [timestamp=" + timestamp + ", status=" + status + ", error=" + error + ", message=" + message + ", path=" + path + "]"; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,28 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.config; | ||||||
|  | 
 | ||||||
|  | import org.springframework.beans.factory.ObjectFactory; | ||||||
|  | import org.springframework.boot.autoconfigure.http.HttpMessageConverters; | ||||||
|  | import org.springframework.cloud.openfeign.support.SpringEncoder; | ||||||
|  | import org.springframework.context.annotation.Bean; | ||||||
|  | import org.springframework.web.client.RestTemplate; | ||||||
|  | 
 | ||||||
|  | import feign.codec.Encoder; | ||||||
|  | import feign.codec.ErrorDecoder; | ||||||
|  | import feign.form.spring.SpringFormEncoder; | ||||||
|  | 
 | ||||||
|  | public class FeignSupportConfig { | ||||||
|  |     @Bean | ||||||
|  |     public Encoder multipartFormEncoder() { | ||||||
|  |         return new SpringFormEncoder(new SpringEncoder(new ObjectFactory<HttpMessageConverters>() { | ||||||
|  |             @Override | ||||||
|  |             public HttpMessageConverters getObject() { | ||||||
|  |                 return new HttpMessageConverters(new RestTemplate().getMessageConverters()); | ||||||
|  |             } | ||||||
|  |         })); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Bean | ||||||
|  |     public ErrorDecoder errorDecoder() { | ||||||
|  |         return new RetreiveMessageErrorDecoder(); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.config; | ||||||
|  | 
 | ||||||
|  | import java.io.IOException; | ||||||
|  | import java.io.InputStream; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.cloud.openfeign.exception.BadRequestException; | ||||||
|  | import com.baeldung.cloud.openfeign.exception.NotFoundException; | ||||||
|  | import com.fasterxml.jackson.databind.ObjectMapper; | ||||||
|  | 
 | ||||||
|  | import feign.Response; | ||||||
|  | import feign.codec.ErrorDecoder; | ||||||
|  | 
 | ||||||
|  | public class RetreiveMessageErrorDecoder implements ErrorDecoder { | ||||||
|  |     private final ErrorDecoder errorDecoder = new Default(); | ||||||
|  |     @Override | ||||||
|  |     public Exception decode(String methodKey, Response response) { | ||||||
|  |         ExceptionMessage message = null; | ||||||
|  |         try (InputStream bodyIs = response.body() | ||||||
|  |             .asInputStream()) { | ||||||
|  |             ObjectMapper mapper = new ObjectMapper(); | ||||||
|  |             message = mapper.readValue(bodyIs, ExceptionMessage.class); | ||||||
|  |         } catch (IOException e) { | ||||||
|  |             return new Exception(e.getMessage()); | ||||||
|  |         } | ||||||
|  |         switch (response.status()) { | ||||||
|  |         case 400: | ||||||
|  |             return new BadRequestException(message.getMessage() != null ? message.getMessage() : "Bad Request"); | ||||||
|  |         case 404: | ||||||
|  |             return new NotFoundException(message.getMessage() != null ? message.getMessage() : "Not found"); | ||||||
|  |         default: | ||||||
|  |             return errorDecoder.decode(methodKey, response); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,30 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.service; | ||||||
|  | 
 | ||||||
|  | import org.springframework.cloud.openfeign.FallbackFactory; | ||||||
|  | import org.springframework.stereotype.Component; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.cloud.openfeign.exception.BadRequestException; | ||||||
|  | import com.baeldung.cloud.openfeign.exception.NotFoundException; | ||||||
|  | 
 | ||||||
|  | @Component | ||||||
|  | public class FileUploadClientFallbackFactory implements FallbackFactory<FileUploadClientWithFallbackFactory> { | ||||||
|  |     @Override | ||||||
|  |     public FileUploadClientWithFallbackFactory create(Throwable cause) { | ||||||
|  |         return new FileUploadClientWithFallbackFactory() { | ||||||
|  |             @Override | ||||||
|  |             public String fileUpload(MultipartFile file) { | ||||||
|  |                 if (cause instanceof BadRequestException) { | ||||||
|  |                     return "Bad Request!!!"; | ||||||
|  |                 } | ||||||
|  |                 if (cause instanceof NotFoundException) { | ||||||
|  |                     return "Not Found!!!"; | ||||||
|  |                 } | ||||||
|  |                 if (cause instanceof Exception) { | ||||||
|  |                     return "Exception!!!"; | ||||||
|  |                 } | ||||||
|  |                 return "Successfully Uploaded file!!!"; | ||||||
|  |             } | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.service; | ||||||
|  | 
 | ||||||
|  | import org.springframework.cloud.openfeign.FeignClient; | ||||||
|  | import org.springframework.http.MediaType; | ||||||
|  | import org.springframework.web.bind.annotation.PostMapping; | ||||||
|  | import org.springframework.web.bind.annotation.RequestPart; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.cloud.openfeign.fileupload.config.FeignSupportConfig; | ||||||
|  | 
 | ||||||
|  | @FeignClient(name = "file", url = "http://localhost:8081", configuration = FeignSupportConfig.class, fallback = FileUploadClientWithFallbackImpl.class) | ||||||
|  | public interface FileUploadClientWithFallBack { | ||||||
|  |     @PostMapping(value = "/upload-error", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) | ||||||
|  | 	String fileUpload(@RequestPart(value = "file") MultipartFile file); | ||||||
|  | } | ||||||
| @ -0,0 +1,15 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.service; | ||||||
|  | 
 | ||||||
|  | import org.springframework.cloud.openfeign.FeignClient; | ||||||
|  | import org.springframework.http.MediaType; | ||||||
|  | import org.springframework.web.bind.annotation.PostMapping; | ||||||
|  | import org.springframework.web.bind.annotation.RequestPart; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.cloud.openfeign.fileupload.config.FeignSupportConfig; | ||||||
|  | 
 | ||||||
|  | @FeignClient(name = "file", url = "http://localhost:8081", configuration = FeignSupportConfig.class, fallbackFactory = FileUploadClientFallbackFactory.class) | ||||||
|  | public interface FileUploadClientWithFallbackFactory { | ||||||
|  |     @PostMapping(value = "/upload-error", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) | ||||||
|  |     String fileUpload(@RequestPart(value = "file") MultipartFile file); | ||||||
|  | } | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.service; | ||||||
|  | 
 | ||||||
|  | import org.springframework.stereotype.Component; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.cloud.openfeign.exception.BadRequestException; | ||||||
|  | import com.baeldung.cloud.openfeign.exception.NotFoundException; | ||||||
|  | 
 | ||||||
|  | @Component | ||||||
|  | public class FileUploadClientWithFallbackImpl implements FileUploadClientWithFallBack { | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public String fileUpload(MultipartFile file) { | ||||||
|  |         try { | ||||||
|  |             throw new NotFoundException("hi, something wrong"); | ||||||
|  |         } catch (Exception ex) { | ||||||
|  | 
 | ||||||
|  |             if (ex instanceof BadRequestException) { | ||||||
|  |                 return "Bad Request!!!"; | ||||||
|  |             } | ||||||
|  |             if (ex instanceof NotFoundException) { | ||||||
|  |                 return "Not Found!!!"; | ||||||
|  |             } | ||||||
|  |             if (ex instanceof Exception) { | ||||||
|  |                 return "Exception!!!"; | ||||||
|  |             } | ||||||
|  |             return "Successfully Uploaded file!!!"; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.service; | ||||||
|  | 
 | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  | 
 | ||||||
|  | import feign.Headers; | ||||||
|  | import feign.Param; | ||||||
|  | import feign.RequestLine; | ||||||
|  | import feign.Response; | ||||||
|  | 
 | ||||||
|  | public interface UploadResource { | ||||||
|  |      | ||||||
|  |     @RequestLine("POST /upload-error") | ||||||
|  |     @Headers("Content-Type: multipart/form-data") | ||||||
|  |     Response uploadFile(@Param("file") MultipartFile file); | ||||||
|  |      | ||||||
|  | } | ||||||
| @ -0,0 +1,34 @@ | |||||||
|  | package com.baeldung.cloud.openfeign.fileupload.service; | ||||||
|  | 
 | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.stereotype.Service; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  | 
 | ||||||
|  | import feign.Feign; | ||||||
|  | import feign.Response; | ||||||
|  | import feign.form.spring.SpringFormEncoder; | ||||||
|  | 
 | ||||||
|  | @Service | ||||||
|  | public class UploadService { | ||||||
|  |     private static final String HTTP_FILE_UPLOAD_URL = "http://localhost:8081"; | ||||||
|  |      | ||||||
|  |     @Autowired | ||||||
|  |     private FileUploadClientWithFallbackFactory fileUploadClient; | ||||||
|  |     @Autowired | ||||||
|  |     private FileUploadClientWithFallBack fileUploadClientWithFallback; | ||||||
|  |      | ||||||
|  |     public boolean uploadFileWithManualClient(MultipartFile file) { | ||||||
|  |         UploadResource fileUploadResource = Feign.builder().encoder(new SpringFormEncoder()) | ||||||
|  |                 .target(UploadResource.class, HTTP_FILE_UPLOAD_URL); | ||||||
|  |         Response response = fileUploadResource.uploadFile(file); | ||||||
|  |         return response.status() == 200; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String uploadFileWithFallbackFactory(MultipartFile file) { | ||||||
|  |         return fileUploadClient.fileUpload(file); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String uploadFileWithFallback(MultipartFile file) { | ||||||
|  |         return fileUploadClientWithFallback.fileUpload(file); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,10 @@ | |||||||
|  | server.port=8085 | ||||||
|  | spring.main.allow-bean-definition-overriding=true | ||||||
|  | spring.application.name= openfeign | ||||||
|  | logging.level.com.baeldung.cloud.openfeign.client: DEBUG | ||||||
|  | feign.hystrix.enabled=true | ||||||
|  | 
 | ||||||
|  | spring.security.oauth2.client.registration.keycloak.authorization-grant-type=client_credentials | ||||||
|  | spring.security.oauth2.client.registration.keycloak.client-id=payment-app | ||||||
|  | spring.security.oauth2.client.registration.keycloak.client-secret=863e9de4-33d4-4471-b35e-f8d2434385bb | ||||||
|  | spring.security.oauth2.client.provider.keycloak.token-uri=http://localhost:8083/auth/realms/master/protocol/openid-connect/token | ||||||
| @ -0,0 +1,61 @@ | |||||||
|  | package com.baeldung.cloud.openfeign; | ||||||
|  | 
 | ||||||
|  | import java.io.File; | ||||||
|  | import java.io.FileInputStream; | ||||||
|  | import java.io.IOException; | ||||||
|  | 
 | ||||||
|  | import org.apache.commons.io.IOUtils; | ||||||
|  | import org.junit.Assert; | ||||||
|  | import org.junit.Test; | ||||||
|  | import org.junit.runner.RunWith; | ||||||
|  | import org.springframework.beans.factory.annotation.Autowired; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | import org.springframework.mock.web.MockMultipartFile; | ||||||
|  | import org.springframework.test.context.junit4.SpringRunner; | ||||||
|  | import org.springframework.web.multipart.MultipartFile; | ||||||
|  | 
 | ||||||
|  | import com.baeldung.cloud.openfeign.exception.NotFoundException; | ||||||
|  | import com.baeldung.cloud.openfeign.fileupload.service.UploadService; | ||||||
|  | 
 | ||||||
|  | @RunWith(SpringRunner.class) | ||||||
|  | @SpringBootTest | ||||||
|  | public class OpenFeignFileUploadLiveTest { | ||||||
|  |      | ||||||
|  |     @Autowired | ||||||
|  |     private UploadService uploadService; | ||||||
|  |      | ||||||
|  |     private static String FILE_NAME = "fileupload.txt"; | ||||||
|  |      | ||||||
|  |     @Test(expected = NotFoundException.class) | ||||||
|  |     public void whenFileUploadClientFallbackFactory_thenFileUploadError() throws IOException { | ||||||
|  |         ClassLoader classloader = Thread.currentThread().getContextClassLoader(); | ||||||
|  |         File file = new File(classloader.getResource(FILE_NAME).getFile()); | ||||||
|  |         Assert.assertTrue(file.exists()); | ||||||
|  |         FileInputStream input = new FileInputStream(file); | ||||||
|  |         MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", | ||||||
|  |                 IOUtils.toByteArray(input)); | ||||||
|  |         uploadService.uploadFileWithFallbackFactory(multipartFile); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Test(expected = NotFoundException.class) | ||||||
|  |     public void whenFileUploadClientFallback_thenFileUploadError() throws IOException { | ||||||
|  |         ClassLoader classloader = Thread.currentThread().getContextClassLoader(); | ||||||
|  |         File file = new File(classloader.getResource(FILE_NAME).getFile()); | ||||||
|  |         Assert.assertTrue(file.exists()); | ||||||
|  |         FileInputStream input = new FileInputStream(file); | ||||||
|  |         MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", | ||||||
|  |                 IOUtils.toByteArray(input)); | ||||||
|  |         uploadService.uploadFileWithFallback(multipartFile); | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     @Test(expected = NotFoundException.class) | ||||||
|  |     public void whenFileUploadWithMannualClient_thenFileUploadError() throws IOException { | ||||||
|  |         ClassLoader classloader = Thread.currentThread().getContextClassLoader(); | ||||||
|  |         File file = new File(classloader.getResource(FILE_NAME).getFile()); | ||||||
|  |         Assert.assertTrue(file.exists()); | ||||||
|  |         FileInputStream input = new FileInputStream(file); | ||||||
|  |         MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "text/plain", | ||||||
|  |                 IOUtils.toByteArray(input)); | ||||||
|  |         uploadService.uploadFileWithManualClient(multipartFile); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,16 @@ | |||||||
|  | package com.baeldung.cloud.openfeign; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | import org.junit.Test; | ||||||
|  | import org.junit.runner.RunWith; | ||||||
|  | import org.springframework.boot.test.context.SpringBootTest; | ||||||
|  | import org.springframework.test.context.junit4.SpringRunner; | ||||||
|  | 
 | ||||||
|  | @RunWith(SpringRunner.class) | ||||||
|  | @SpringBootTest(classes = ExampleApplication.class) | ||||||
|  | public class SpringContextTest { | ||||||
|  |      | ||||||
|  |     @Test | ||||||
|  |     public void whenSpringContextIsBootstrapped_thenNoExceptions() { | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -13,7 +13,7 @@ public class CustomErrorDecoder implements ErrorDecoder { | |||||||
|             case 400: |             case 400: | ||||||
|                 return new BadRequestException(); |                 return new BadRequestException(); | ||||||
|             case 404: |             case 404: | ||||||
|                 return new NotFoundException(); |                 return new NotFoundException("Not found !!!"); | ||||||
|             default: |             default: | ||||||
|                 return new Exception("Generic error"); |                 return new Exception("Generic error"); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -2,9 +2,6 @@ package com.baeldung.cloud.openfeign.exception; | |||||||
| 
 | 
 | ||||||
| public class NotFoundException extends Exception { | public class NotFoundException extends Exception { | ||||||
| 
 | 
 | ||||||
|     public NotFoundException() { |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public NotFoundException(String message) { |     public NotFoundException(String message) { | ||||||
|         super(message); |         super(message); | ||||||
|     } |     } | ||||||
| @ -15,7 +12,7 @@ public class NotFoundException extends Exception { | |||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     public String toString() { |     public String toString() { | ||||||
|         return "NotFoundException: "+getMessage(); |         return "NotFoundException: " + getMessage(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ public class UploadService { | |||||||
|      |      | ||||||
|     @Autowired |     @Autowired | ||||||
|     private UploadClient client; |     private UploadClient client; | ||||||
|      | 
 | ||||||
|     public boolean uploadFileWithManualClient(MultipartFile file) { |     public boolean uploadFileWithManualClient(MultipartFile file) { | ||||||
|         UploadResource fileUploadResource = Feign.builder().encoder(new SpringFormEncoder()) |         UploadResource fileUploadResource = Feign.builder().encoder(new SpringFormEncoder()) | ||||||
|                 .target(UploadResource.class, HTTP_FILE_UPLOAD_URL); |                 .target(UploadResource.class, HTTP_FILE_UPLOAD_URL); | ||||||
| @ -29,5 +29,4 @@ public class UploadService { | |||||||
|     public String uploadFileError(MultipartFile file) { |     public String uploadFileError(MultipartFile file) { | ||||||
|         return client.fileUpload(file); |         return client.fileUpload(file); | ||||||
|     } |     } | ||||||
|      |  | ||||||
| } | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user