diff --git a/build.gradle.kts b/build.gradle.kts index fc5abdc..c54fab1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,6 +19,10 @@ repositories { dependencies { implementation("org.springframework.boot:spring-boot-starter") + implementation("org.springframework.boot:spring-boot-starter-web") + implementation("org.springframework.boot:spring-boot-starter-thymeleaf") + implementation("org.projectlombok:lombok:1.18.30") + annotationProcessor("org.projectlombok:lombok:1.18.30") testImplementation("org.springframework.boot:spring-boot-starter-test") testRuntimeOnly("org.junit.platform:junit-platform-launcher") } diff --git a/src/main/java/org/javaspringcourse/controller/HeadersController.java b/src/main/java/org/javaspringcourse/controller/HeadersController.java new file mode 100644 index 0000000..6491019 --- /dev/null +++ b/src/main/java/org/javaspringcourse/controller/HeadersController.java @@ -0,0 +1,20 @@ +package org.javaspringcourse.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; + +import java.util.Map; + +@Controller +@RequestMapping("/headers") +public class HeadersController { + + @GetMapping + public String getHeaders(@RequestHeader Map headers, Model model) { + model.addAttribute("headers", headers); + return "headers"; + } +} diff --git a/src/main/java/org/javaspringcourse/controller/JsonController.java b/src/main/java/org/javaspringcourse/controller/JsonController.java new file mode 100644 index 0000000..39bea7f --- /dev/null +++ b/src/main/java/org/javaspringcourse/controller/JsonController.java @@ -0,0 +1,25 @@ +package org.javaspringcourse.controller; + +import lombok.RequiredArgsConstructor; +import org.javaspringcourse.exception.BadGatewayException; +import org.javaspringcourse.model.dto.JsonItemIn; +import org.javaspringcourse.model.dto.JsonItemOut; +import org.javaspringcourse.service.JsonService; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/json") +public class JsonController { + private final JsonService service; + + @PostMapping + public JsonItemOut registerJson(@RequestBody JsonItemIn product) { + return service.register(product); + } + + @GetMapping("/error502") + public void getError502() { + throw new BadGatewayException("502 Bad Gateway"); + } +} diff --git a/src/main/java/org/javaspringcourse/exception/BadGatewayException.java b/src/main/java/org/javaspringcourse/exception/BadGatewayException.java new file mode 100644 index 0000000..03cac8b --- /dev/null +++ b/src/main/java/org/javaspringcourse/exception/BadGatewayException.java @@ -0,0 +1,7 @@ +package org.javaspringcourse.exception; + +public class BadGatewayException extends RuntimeException { + public BadGatewayException(String message) { + super(message); + } +} diff --git a/src/main/java/org/javaspringcourse/exception/ErrorResponse.java b/src/main/java/org/javaspringcourse/exception/ErrorResponse.java new file mode 100644 index 0000000..17d0232 --- /dev/null +++ b/src/main/java/org/javaspringcourse/exception/ErrorResponse.java @@ -0,0 +1,3 @@ +package org.javaspringcourse.exception; + +public record ErrorResponse(String code, String message) {} \ No newline at end of file diff --git a/src/main/java/org/javaspringcourse/exception/JsonExceptionHandler.java b/src/main/java/org/javaspringcourse/exception/JsonExceptionHandler.java new file mode 100644 index 0000000..e2cdc54 --- /dev/null +++ b/src/main/java/org/javaspringcourse/exception/JsonExceptionHandler.java @@ -0,0 +1,16 @@ +package org.javaspringcourse.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@RestControllerAdvice +public class JsonExceptionHandler { + @ExceptionHandler(BadGatewayException.class) + @ResponseStatus(HttpStatus.BAD_GATEWAY) + public ErrorResponse handleBadGatewayException(BadGatewayException ex) { + return new ErrorResponse("502", ex.getMessage()); + } +} \ No newline at end of file diff --git a/src/main/java/org/javaspringcourse/model/JsonItem.java b/src/main/java/org/javaspringcourse/model/JsonItem.java new file mode 100644 index 0000000..ae40dcf --- /dev/null +++ b/src/main/java/org/javaspringcourse/model/JsonItem.java @@ -0,0 +1,14 @@ +package org.javaspringcourse.model; + +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + +@Data +@Builder +public class JsonItem { + private int id; + private double price; + private Date date; +} diff --git a/src/main/java/org/javaspringcourse/model/dto/JsonItemIn.java b/src/main/java/org/javaspringcourse/model/dto/JsonItemIn.java new file mode 100644 index 0000000..6ded866 --- /dev/null +++ b/src/main/java/org/javaspringcourse/model/dto/JsonItemIn.java @@ -0,0 +1,16 @@ +package org.javaspringcourse.model.dto; + +import lombok.Data; + +import java.util.Date; + +@Data +public class JsonItemIn { + private double price; + private Info info; + + @Data + public static class Info { + Date date; + } +} diff --git a/src/main/java/org/javaspringcourse/model/dto/JsonItemOut.java b/src/main/java/org/javaspringcourse/model/dto/JsonItemOut.java new file mode 100644 index 0000000..7f3831a --- /dev/null +++ b/src/main/java/org/javaspringcourse/model/dto/JsonItemOut.java @@ -0,0 +1,20 @@ +package org.javaspringcourse.model.dto; + +import lombok.Builder; +import lombok.Data; + +import java.util.Date; + +@Data +@Builder +public class JsonItemOut { + private double price; + private Info info; + + @Data + @Builder + public static class Info { + int id; + Date date; + } +} diff --git a/src/main/java/org/javaspringcourse/service/JsonService.java b/src/main/java/org/javaspringcourse/service/JsonService.java new file mode 100644 index 0000000..5fb0845 --- /dev/null +++ b/src/main/java/org/javaspringcourse/service/JsonService.java @@ -0,0 +1,35 @@ +package org.javaspringcourse.service; + +import org.javaspringcourse.model.JsonItem; +import org.javaspringcourse.model.dto.JsonItemIn; +import org.javaspringcourse.model.dto.JsonItemOut; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class JsonService { + private final static List jsonItems = new ArrayList<>(); + + public JsonItemOut register(JsonItemIn jsonItem) { + var json = JsonItem.builder() + .id(jsonItems.size() + 1) + .price(jsonItem.getPrice()) + .date(jsonItem.getInfo().getDate()) + .build(); + jsonItems.add(json); + return toJsonItemOut(json); + } + + private JsonItemOut toJsonItemOut(JsonItem jsonItem) { + var info = JsonItemOut.Info.builder() + .id(jsonItem.getId()) + .date(jsonItem.getDate()) + .build(); + return JsonItemOut.builder() + .price(jsonItem.getPrice()) + .info(info) + .build(); + } +} diff --git a/src/main/resources/templates/headers.html b/src/main/resources/templates/headers.html new file mode 100644 index 0000000..3ef6e04 --- /dev/null +++ b/src/main/resources/templates/headers.html @@ -0,0 +1,16 @@ + + + + + Заголовки запроса + + +

Заголовки запроса

+ + + + + +
+ + \ No newline at end of file