# Building a REST Controller End to End — Advanced Java

Source: https://www.geekswithgeeks.com/en/advanced-java/adv-rest-e2e

> Wire a full Spring Web REST endpoint from request to response, and see how Jackson silently converts your Java objects to and from JSON.

## Request in, response out

`@RequestBody` deserializes the incoming JSON into a Java object; the return value is serialized back to JSON automatically. `@Valid` triggers bean-validation annotations on the DTO before the method body even runs.

```java
record CreateOrderRequest(@NotBlank String customerId, @Positive int quantity) {}

@RestController
@RequestMapping("/api/orders")
class OrderController {
    private final OrderService service;
    OrderController(OrderService service) { this.service = service; }

    @PostMapping
    ResponseEntity<Order> create(@Valid @RequestBody CreateOrderRequest req) {
        Order created = service.place(req.customerId(), req.quantity());
        return ResponseEntity.status(HttpStatus.CREATED).body(created);
    }
}
```

## Jackson does the JSON work

Jackson maps Java field names to JSON keys by convention, and handles nested objects, lists, and `LocalDate`/records automatically (with the `jackson-datatype-jsr310` module). Rename a JSON key with `@JsonProperty`, or hide an internal field with `@JsonIgnore`.

## Customising the JSON

Field-level annotations steer serialization without changing your API's shape for callers.

```java
class UserDto {
    @JsonProperty("user_id")
    Long id;

    String email;

    @JsonIgnore
    String passwordHash;   // never serialized
}
```
