Как правильно спроектировать плоский объект, расширяющий адрес в пружине, с узором застройщика?JAVA

Программисты JAVA общаются здесь
Anonymous
Как правильно спроектировать плоский объект, расширяющий адрес в пружине, с узором застройщика?

Сообщение Anonymous »

Я работаю над приложением для Spring Boot Java, используя JPA, где у меня есть адресный базовый класс и плоский подкласс, представляющий квартиру. Я написал несколько тестов, используя TestResttemplate Spring Boot. Должен ли я использовать int или long вместо этого для идентификаторов, таких как Unitnumber и AddersID? /> домен: < /p>
package za.ac.shinysneakerz.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

@Entity
public class Flat extends Address{

@Id
private short unitNumber;

private String flatName;

protected Flat() {
super();
}

private Flat(Builder builder) {
this.unitNumber = builder.unitNumber;
this.flatName = builder.flatName;

this.addressId = builder.addressId;
this.streetNumber = builder.streetNumber;
this.streetName = builder.streetName;
this.suburb = builder.suburb;
this.city = builder.city;
this.province = builder.province;
this.postalCode = builder.postalCode;
}

public short getUnitNumber() {
return unitNumber;
}
public String getFlatName() {
return flatName;
}

@Override
public String toString() {
return "Flat{" +
"flatName='" + flatName + '\'' +
", unitNumber=" + unitNumber +
'}';
}

public static class Builder{
private short unitNumber;
private String flatName;

private Long addressId;
private short streetNumber;
private String streetName;
private String suburb;
private String city;
private String province;
private short postalCode;

public Builder setUnitNumber ( short unitNumber){
this.unitNumber = unitNumber;
return this;
}

public Builder setFlatName (String flatName){
this.flatName = flatName;
return this;
}

public Builder setAddressId(Long addressId) {
this.addressId = addressId;
return this;
}

public Builder setSuburb(String suburb) {
this.suburb = suburb;
return this;
}

public Builder setCity(String city) {
this.city = city;
return this;
}

public Builder setPostalCode(short postalCode) {
this.postalCode = postalCode;
return this;
}

public Builder setProvince(String province) {
this.province = province;
return this;
}

public Builder setStreetName(String streetName) {
this.streetName = streetName;
return this;
}

public Builder setStreetNumber(short streetNumber) {
this.streetNumber = streetNumber;
return this;
}

public Builder copy(Flat flat){
this.unitNumber = flat.unitNumber;
this.flatName = flat.flatName;

this.addressId = flat.addressId;
this.streetNumber = flat.streetNumber;
this.streetName = flat.streetName;
this.suburb = flat.suburb;
this.city = flat.city;
this.province = flat.province;
this.postalCode = flat.postalCode;

return this;
}

public Flat build(){
return new Flat(this);
}

}

}
< /code>
factory: < /p>
package za.ac.shinysneakerz.factory;

import za.ac.shinysneakerz.domain.Flat;
import za.ac.shinysneakerz.util.Helper;

public class FlatFactory {

public static Flat createFlat(short unitNumber, String flatName, Long addressId, short streetNumber, String suburb, String city, String province, short postalCode) {

if(Helper.isNullOrEmpty(flatName)
|| Helper.isValidPostalCode(postalCode)
|| Helper.isValidStreetNumber(streetNumber)
|| Helper.isValidUnitNumber(unitNumber)){
return null;
}

return new Flat.Builder()
.setUnitNumber(unitNumber)
.setFlatName(flatName)
.setAddressId(addressId)
.setSuburb(suburb)
.setCity(city)
.setProvince(province)
.setPostalCode(postalCode)
.build();

}
}
< /code>
Repository: < /p>
package za.ac.shinysneakerz.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import za.ac.shinysneakerz.domain.Flat;

import java.util.Optional;
import java.util.Set;

@Repository
public interface FlatRepository extends JpaRepository {

Set getAll();

Optional findByFlatName(String flatName);

Optional findByStreetName(String streetName); //This are the address atts put them in flat too

//Optional findByStreetNumber(Long streetNumber); //This are the address atts put them in flat too

//Optional findByStreetNumber(long streetNumber);
}
< /code>
Flat Service: < /p>
package za.ac.shinysneakerz.service;

import za.ac.shinysneakerz.domain.Flat;

import java.util.Optional;
import java.util.Set;

public interface FlatService extends Service {
Set getAll();

Optional findByFlatName(String flatName);

Optional findByStreetName(String streetName);
}
< /code>
Реализация службы: < /p>
package za.ac.shinysneakerz.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import za.ac.shinysneakerz.domain.Flat;
import za.ac.shinysneakerz.repository.FlatRepository;

import java.util.Optional;
import java.util.Set;

@Service
public class FlatServiceImplementation implements FlatService {

// @Autowired
// private static FlatService service;

private FlatRepository repository;

@Autowired //Constructor injection
FlatServiceImplementation(FlatRepository repository) {
this.repository = repository;
}

@Override
public Set getAll() {
return this.repository.getAll();
//return this.repository.findAll();
}

@Override
public Optional findByFlatName(String flatName) {
return Optional.empty();
}

@Override
public Optional findByStreetName(String streetName) {
return Optional.empty();
}

@Override
public Flat create(Flat flat) {
return this.repository.save(flat);
}

@Override
public Flat read(Short id) {
return this.repository.findById(id).orElse(null);
}

@Override
public Flat update(Flat flat) {
return this.repository.save(flat);
}

@Override
public void delete(Short id) {
this.repository.deleteById(id);
}

}
< /code>
Интерфейс службы: < /p>
package za.ac.shinysneakerz.service;

public interface Service {
//T create(ID id); //Naidoo uses T's here
T create(T t);

T read(ID id);

T update(T t);

//void delete(T t); //Naidoo uses ID's here
void delete(ID id);
}
< /code>
Тест контроллера: < /p>
package za.ac.shinysneakerz.controller;

import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.ResponseEntity;
import za.ac.shinysneakerz.domain.Flat;
import za.ac.shinysneakerz.factory.FlatFactory;

import static org.junit.jupiter.api.Assertions.*;

//@SpringBootTest
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class FlatControllerTest {

private static Flat flat;

@Autowired
private TestRestTemplate restTemplate;

private static final String baseUrl = "http://localhost:8080/flat";
//private String baseUrl = "http://localhost:8080/flat";

@BeforeAll
public static void setUp() {
flat = FlatFactory.createFlat((short) 23, "Blake", 123456L, (short) 23, "Bold", "Cape", "Some",(short) 45);
}

@Test
@Order(1)
void create() {
String url = baseUrl + "/create";
System.out.println("Post data: " + flat);
ResponseEntity postResponse = restTemplate.postForEntity(url, flat, Flat.class);
System.out.println("Save data: " + flat);
assertNotNull(postResponse.getBody());;
}

@Test
@Order(2)
void read() {
String url = baseUrl + "/read" + flat.getUnitNumber();
System.out.println("URL: " + url);
ResponseEntity postResponse = restTemplate.getForEntity(url, Flat.class);
assertNotNull(postResponse.getBody());
}

@Test
@Order(3)
void update() {
Flat updated = new Flat.Builder().copy(flat).setFlatName("Bloke").build();
String url = baseUrl + "update";
System.out.println("Post data: " + updated);
ResponseEntity response = restTemplate.postForEntity(url, updated, Flat.class);
assertNotNull(response.getBody());
}

@Test
@Order(4)
void getAll() {
String url = baseUrl + "All";
System.out.println("URL: " + url);
}

@Test
@Order(5)
void delete() {
String url = baseUrl + "delete/" + flat.getUnitNumber();
System.out.println("URL: " + url);
restTemplate.delete(url);
}
}

< /code>
Фабричный тест: < /p>
package za.ac.shinysneakerz.factory;

import org.junit.jupiter.api.Test;
import za.ac.shinysneakerz.domain.Flat;

import static org.junit.jupiter.api.Assertions.*;
class FlatFactoryTest {

@Test
void createFlat() {
//Flat flat = FlatFactory.createFlat((short) 10, "Blake");
Flat flat = FlatFactory.createFlat((short) 23, "Blake", 123456L, (short) 23, "Bold", "Cape", "Some",(short) 45);
}
}

Service Test:
package za.ac.shinysneakerz.service;

import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import za.ac.shinysneakerz.domain.Flat;
import za.ac.shinysneakerz.factory.FlatFactory;

import static org.junit.jupiter.api.Assertions.*;

@SpringBootTest
@TestMethodOrder(MethodOrderer.MethodName.class)
class FlatServiceImplementationTest {

@Autowired
private FlatService service;

private Flat flat = FlatFactory.createFlat((short) 23, "Blake", 123456L, (short) 23, "Bold", "Cape", "Some",(short) 45);

// @Test
// void findByFlatName() {
// }
//
// @Test
// void findByStreetName() {
// }

@Test
void create() {
Flat created = service.create(flat);
assertNotNull(created);
System.out.println(created);
}

@Test
void read() {
Flat read = service.read(flat.getUnitNumber());
assertNotNull(read);
System.out.println(read);
}

@Test
void update() {
Flat newFlat = new Flat.Builder().copy(flat).setFlatName("Ryan").build();
Flat updated = service.update(newFlat);
assertNotNull(updated);
System.out.println(updated);
}

@Test
void getAll() {
System.out.println(service.getAll());
}

@Test
void delete() {
}
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... with-build

Вернуться в «JAVA»