Skip to content

Commit 39f6670

Browse files
authored
Introducing record class to only customer-service to start with (#253)
Introducing record to the petclinic customer-service microservice
1 parent 81a1cc0 commit 39f6670

File tree

8 files changed

+79
-60
lines changed

8 files changed

+79
-60
lines changed

spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/model/Owner.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,6 @@ public void addPet(Pet pet) {
113113
@Override
114114
public String toString() {
115115
return new ToStringCreator(this)
116-
117116
.append("id", this.getId())
118117
.append("lastName", this.getLastName())
119118
.append("firstName", this.getFirstName())
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package org.springframework.samples.petclinic.customers.web;
2+
3+
import jakarta.validation.constraints.Digits;
4+
import jakarta.validation.constraints.NotBlank;
5+
6+
public record OwnerRequest(@NotBlank String firstName,
7+
@NotBlank String lastName,
8+
@NotBlank String address,
9+
@NotBlank String city,
10+
@NotBlank
11+
@Digits(fraction = 0, integer = 12)
12+
String telephone
13+
) {
14+
}

spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/web/OwnerResource.java

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616
package org.springframework.samples.petclinic.customers.web;
1717

1818
import io.micrometer.core.annotation.Timed;
19+
import jakarta.validation.Valid;
20+
import jakarta.validation.constraints.Min;
1921
import lombok.RequiredArgsConstructor;
2022
import lombok.extern.slf4j.Slf4j;
2123
import org.springframework.http.HttpStatus;
24+
import org.springframework.samples.petclinic.customers.web.mapper.OwnerEntityMapper;
2225
import org.springframework.samples.petclinic.customers.model.Owner;
2326
import org.springframework.samples.petclinic.customers.model.OwnerRepository;
2427
import org.springframework.web.bind.annotation.*;
2528

26-
import jakarta.validation.Valid;
27-
import jakarta.validation.constraints.Min;
2829
import java.util.List;
2930
import java.util.Optional;
3031

@@ -43,13 +44,15 @@
4344
class OwnerResource {
4445

4546
private final OwnerRepository ownerRepository;
47+
private final OwnerEntityMapper ownerEntityMapper;
4648

4749
/**
4850
* Create Owner
4951
*/
5052
@PostMapping
5153
@ResponseStatus(HttpStatus.CREATED)
52-
public Owner createOwner(@Valid @RequestBody Owner owner) {
54+
public Owner createOwner(@Valid @RequestBody OwnerRequest ownerRequest) {
55+
Owner owner = ownerEntityMapper.map(new Owner(), ownerRequest);
5356
return ownerRepository.save(owner);
5457
}
5558

@@ -74,16 +77,10 @@ public List<Owner> findAll() {
7477
*/
7578
@PutMapping(value = "/{ownerId}")
7679
@ResponseStatus(HttpStatus.NO_CONTENT)
77-
public void updateOwner(@PathVariable("ownerId") @Min(1) int ownerId, @Valid @RequestBody Owner ownerRequest) {
78-
final Optional<Owner> owner = ownerRepository.findById(ownerId);
79-
final Owner ownerModel = owner.orElseThrow(() -> new ResourceNotFoundException("Owner "+ownerId+" not found"));
80+
public void updateOwner(@PathVariable("ownerId") @Min(1) int ownerId, @Valid @RequestBody OwnerRequest ownerRequest) {
81+
final Owner ownerModel = ownerRepository.findById(ownerId).orElseThrow(() -> new ResourceNotFoundException("Owner " + ownerId + " not found"));
8082

81-
// This is done by hand for simplicity purpose. In a real life use-case we should consider using MapStruct.
82-
ownerModel.setFirstName(ownerRequest.getFirstName());
83-
ownerModel.setLastName(ownerRequest.getLastName());
84-
ownerModel.setCity(ownerRequest.getCity());
85-
ownerModel.setAddress(ownerRequest.getAddress());
86-
ownerModel.setTelephone(ownerRequest.getTelephone());
83+
ownerEntityMapper.map(ownerModel, ownerRequest);
8784
log.info("Saving owner {}", ownerModel);
8885
ownerRepository.save(ownerModel);
8986
}

spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/web/PetDetails.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,30 @@
1515
*/
1616
package org.springframework.samples.petclinic.customers.web;
1717

18-
import lombok.Data;
19-
20-
import java.util.Date;
21-
2218
import org.springframework.format.annotation.DateTimeFormat;
2319
import org.springframework.samples.petclinic.customers.model.Pet;
2420
import org.springframework.samples.petclinic.customers.model.PetType;
2521

22+
import java.util.Date;
23+
2624
/**
2725
* @author [email protected] on 2016-12-05.
2826
*/
29-
@Data
30-
class PetDetails {
3127

32-
private long id;
28+
record PetDetails(
3329

34-
private String name;
30+
long id,
3531

36-
private String owner;
32+
String name,
3733

38-
@DateTimeFormat(pattern = "yyyy-MM-dd")
39-
private Date birthDate;
34+
String owner,
4035

41-
private PetType type;
36+
@DateTimeFormat(pattern = "yyyy-MM-dd")
37+
Date birthDate,
4238

43-
PetDetails(Pet pet) {
44-
this.id = pet.getId();
45-
this.name = pet.getName();
46-
this.owner = pet.getOwner().getFirstName() + " " + pet.getOwner().getLastName();
47-
this.birthDate = pet.getBirthDate();
48-
this.type = pet.getType();
39+
PetType type
40+
) {
41+
public PetDetails(Pet pet) {
42+
this(pet.getId(), pet.getName(), pet.getOwner().getFirstName() + " " + pet.getOwner().getLastName(), pet.getBirthDate(), pet.getType());
4943
}
5044
}

spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/web/PetRequest.java

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,26 +15,20 @@
1515
*/
1616
package org.springframework.samples.petclinic.customers.web;
1717

18-
import lombok.Data;
19-
20-
import java.util.Date;
21-
18+
import com.fasterxml.jackson.annotation.JsonFormat;
2219
import jakarta.validation.constraints.Size;
2320

24-
import com.fasterxml.jackson.annotation.JsonFormat;
21+
import java.util.Date;
2522

2623
/**
2724
* @author [email protected] on 2016-12-05.
2825
*/
29-
@Data
30-
class PetRequest {
31-
private int id;
32-
33-
@JsonFormat(pattern = "yyyy-MM-dd")
34-
private Date birthDate;
35-
36-
@Size(min = 1)
37-
private String name;
26+
record PetRequest(int id,
27+
@JsonFormat(pattern = "yyyy-MM-dd")
28+
Date birthDate,
29+
@Size(min = 1)
30+
String name,
31+
int typeId
32+
) {
3833

39-
private int typeId;
4034
}

spring-petclinic-customers-service/src/main/java/org/springframework/samples/petclinic/customers/web/PetResource.java

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616
package org.springframework.samples.petclinic.customers.web;
1717

1818
import io.micrometer.core.annotation.Timed;
19+
import jakarta.validation.constraints.Min;
1920
import lombok.RequiredArgsConstructor;
2021
import lombok.extern.slf4j.Slf4j;
2122
import org.springframework.http.HttpStatus;
2223
import org.springframework.samples.petclinic.customers.model.*;
2324
import org.springframework.web.bind.annotation.*;
2425

25-
import jakarta.validation.constraints.Min;
2626
import java.util.List;
27-
import java.util.Optional;
2827

2928
/**
3029
* @author Juergen Hoeller
@@ -54,8 +53,8 @@ public Pet processCreationForm(
5453
@RequestBody PetRequest petRequest,
5554
@PathVariable("ownerId") @Min(1) int ownerId) {
5655

57-
final Optional<Owner> optionalOwner = ownerRepository.findById(ownerId);
58-
Owner owner = optionalOwner.orElseThrow(() -> new ResourceNotFoundException("Owner "+ownerId+" not found"));
56+
Owner owner = ownerRepository.findById(ownerId)
57+
.orElseThrow(() -> new ResourceNotFoundException("Owner " + ownerId + " not found"));
5958

6059
final Pet pet = new Pet();
6160
owner.addPet(pet);
@@ -65,17 +64,17 @@ public Pet processCreationForm(
6564
@PutMapping("/owners/*/pets/{petId}")
6665
@ResponseStatus(HttpStatus.NO_CONTENT)
6766
public void processUpdateForm(@RequestBody PetRequest petRequest) {
68-
int petId = petRequest.getId();
67+
int petId = petRequest.id();
6968
Pet pet = findPetById(petId);
7069
save(pet, petRequest);
7170
}
7271

7372
private Pet save(final Pet pet, final PetRequest petRequest) {
7473

75-
pet.setName(petRequest.getName());
76-
pet.setBirthDate(petRequest.getBirthDate());
74+
pet.setName(petRequest.name());
75+
pet.setBirthDate(petRequest.birthDate());
7776

78-
petRepository.findPetTypeById(petRequest.getTypeId())
77+
petRepository.findPetTypeById(petRequest.typeId())
7978
.ifPresent(pet::setType);
8079

8180
log.info("Saving pet {}", pet);
@@ -84,16 +83,14 @@ private Pet save(final Pet pet, final PetRequest petRequest) {
8483

8584
@GetMapping("owners/*/pets/{petId}")
8685
public PetDetails findPet(@PathVariable("petId") int petId) {
87-
return new PetDetails(findPetById(petId));
86+
Pet pet = findPetById(petId);
87+
return new PetDetails(pet);
8888
}
8989

9090

9191
private Pet findPetById(int petId) {
92-
Optional<Pet> pet = petRepository.findById(petId);
93-
if (!pet.isPresent()) {
94-
throw new ResourceNotFoundException("Pet "+petId+" not found");
95-
}
96-
return pet.get();
92+
return petRepository.findById(petId)
93+
.orElseThrow(() -> new ResourceNotFoundException("Pet " + petId + " not found"));
9794
}
9895

9996
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.springframework.samples.petclinic.customers.web.mapper;
2+
3+
public interface Mapper<R, E> {
4+
E map(E response, R request);
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package org.springframework.samples.petclinic.customers.web.mapper;
2+
3+
import org.springframework.samples.petclinic.customers.model.Owner;
4+
import org.springframework.samples.petclinic.customers.web.OwnerRequest;
5+
import org.springframework.stereotype.Component;
6+
7+
@Component
8+
public class OwnerEntityMapper implements Mapper<OwnerRequest, Owner> {
9+
// This is done by hand for simplicity purpose. In a real life use-case we should consider using MapStruct.
10+
@Override
11+
public Owner map(final Owner owner, final OwnerRequest request) {
12+
owner.setAddress(request.address());
13+
owner.setCity(request.city());
14+
owner.setTelephone(request.telephone());
15+
owner.setFirstName(request.firstName());
16+
owner.setLastName(request.lastName());
17+
return owner;
18+
}
19+
}

0 commit comments

Comments
 (0)