parent
ffb8bb4d71
commit
e67fdcf8b3
|
|
@ -17,6 +17,7 @@ public interface StorageService {
|
|||
Path load(String filename);
|
||||
|
||||
Resource loadAsResource(String filename);
|
||||
Resource loadAsResource(String dir, String filename);
|
||||
|
||||
void deleteAll();
|
||||
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import java.nio.file.Files;
|
|||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.StorageService;
|
||||
|
|
@ -23,6 +24,9 @@ public class FileSystemStorageService implements StorageService {
|
|||
|
||||
private final Path rootLocation;
|
||||
|
||||
private static final Logger logger = Logger.getLogger(FileSystemStorageService.class.getSimpleName());
|
||||
|
||||
|
||||
@Autowired
|
||||
public FileSystemStorageService(StorageProperties properties) {
|
||||
this.rootLocation = Paths.get(properties.getLocation());
|
||||
|
|
@ -82,6 +86,27 @@ public class FileSystemStorageService implements StorageService {
|
|||
public Resource loadAsResource(String filename) {
|
||||
try {
|
||||
Path file = load(filename);
|
||||
logger.info(file.toAbsolutePath().toString());
|
||||
Resource resource = new UrlResource(file.toUri());
|
||||
if (resource.exists() || resource.isReadable()) {
|
||||
return resource;
|
||||
}
|
||||
else {
|
||||
throw new StorageFileNotFoundException(
|
||||
"Could not read file: " + filename);
|
||||
|
||||
}
|
||||
}
|
||||
catch (MalformedURLException e) {
|
||||
throw new StorageFileNotFoundException("Could not read file: " + filename, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Resource loadAsResource(String dir, String filename) {
|
||||
try {
|
||||
Path file = load(dir).resolve(filename);
|
||||
logger.info(file.toAbsolutePath().toString());
|
||||
Resource resource = new UrlResource(file.toUri());
|
||||
if (resource.exists() || resource.isReadable()) {
|
||||
return resource;
|
||||
|
|
|
|||
|
|
@ -1,22 +1,45 @@
|
|||
package eu.csc.ODPAppVehOwnServer.persistence.services.storage;
|
||||
|
||||
import eu.csc.ODPAppVehOwnServer.models.VehicleBrandDto;
|
||||
import eu.csc.ODPAppVehOwnServer.models.VehicleModelDto;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.GsonService;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.StorageService;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
|
||||
public class MetaDataStorageService {
|
||||
|
||||
private final StorageService storageService;
|
||||
|
||||
private static final String FILENAME_PROPULSION_TYPE = "propulsionTypes.json";
|
||||
private static final String FILENAME_BRANDS = "brands.json";
|
||||
private static final String FILENAME_DEVICES = "devices.json";
|
||||
|
||||
private static final String FOLDER_MODELS = "models";
|
||||
|
||||
|
||||
private GsonService gsonService = new GsonService();
|
||||
|
||||
public MetaDataStorageService(Path path) {
|
||||
this.storageService = new FileSystemStorageService(path);
|
||||
}
|
||||
public MetaDataStorageService(StorageService storageService) {
|
||||
this.storageService = storageService;
|
||||
|
||||
public List<VehicleBrandDto> openBrands() throws FileNotFoundException {
|
||||
return openBrands(FILENAME_BRANDS);
|
||||
}
|
||||
|
||||
|
||||
public List<VehicleModelDto> openModels(String brand) throws FileNotFoundException {
|
||||
|
||||
var file = storageService.load(FOLDER_MODELS).resolve(brand + ".json").toFile();
|
||||
|
||||
return gsonService.readJson(gsonService.getTypeTokenList(), file);
|
||||
}
|
||||
|
||||
public List<VehicleBrandDto> openBrands(String filename) throws FileNotFoundException {
|
||||
|
||||
return gsonService.readJson(gsonService.getTypeTokenList(), storageService.load(filename).toFile());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,5 +11,5 @@
|
|||
|
||||
|
||||
## Shell
|
||||
|
||||
i_set_loc C:\Users\yanni\Desktop\dev\priv\ODP-AppVehOwnServer\doc\data
|
||||
C:\Users\yanni\Desktop\dev\priv\ODP-AppVehOwnServer\doc\data
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
[
|
||||
{
|
||||
"id": "ford",
|
||||
"brandId": "ford",
|
||||
"name": "Ford"
|
||||
}
|
||||
]
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
[
|
||||
|
||||
]
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
|
|
@ -1,7 +1,9 @@
|
|||
[
|
||||
{
|
||||
"id": null,
|
||||
"brand": "ford",
|
||||
"brand": {
|
||||
"brandId": "ford"
|
||||
},
|
||||
"modelId": "focus",
|
||||
"name": "Focus",
|
||||
"propulsionType": "petrol"
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
|
|
@ -18,7 +18,6 @@ import javax.persistence.*;
|
|||
@Table(name = "tcustomer_vehicles")
|
||||
public class CustomerVehicleEntity extends AbstractCustomerEntity {
|
||||
|
||||
|
||||
@Column(nullable = false)
|
||||
private String vin;
|
||||
|
||||
|
|
@ -27,12 +26,12 @@ public class CustomerVehicleEntity extends AbstractCustomerEntity {
|
|||
|
||||
@Column(nullable = false)
|
||||
private String model;
|
||||
|
||||
@Column(name = "license_plate", nullable = false)
|
||||
private String licensePlate;
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(nullable = true, name = "cd_id", insertable = false, updatable = false)
|
||||
|
||||
private CustomerDeviceEntity activeCustomerDevice;
|
||||
|
||||
@Column(name = "cd_id", nullable = true)
|
||||
|
|
|
|||
|
|
@ -13,4 +13,5 @@ public interface VehicleBrandRepository extends JpaRepository<VehicleBrandEntity
|
|||
|
||||
Optional<VehicleBrandEntity> findOneByBrandId(String brand);
|
||||
|
||||
VehicleBrandEntity getOneByBrandId(String brandId);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,10 +33,8 @@ public class DeviceService {
|
|||
|
||||
var oD = deviceRepository.findByDevicenumber(device);
|
||||
|
||||
|
||||
entity.setDevice(oD.get());
|
||||
|
||||
|
||||
entity.setSerialNumber(utilsService.getSerialnumber(deviceArticleRepository.countAllByDeviceDevicenumber(device)));
|
||||
deviceArticleRepository.save(entity);
|
||||
|
||||
|
|
|
|||
|
|
@ -4,12 +4,10 @@ import com.google.gson.Gson;
|
|||
import com.google.gson.GsonBuilder;
|
||||
import com.google.gson.reflect.TypeToken;
|
||||
import com.google.gson.stream.JsonReader;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.FileReader;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.*;
|
||||
import java.lang.reflect.Type;
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -19,6 +17,7 @@ public class GsonService {
|
|||
|
||||
private final Gson gson;
|
||||
|
||||
@Autowired
|
||||
public GsonService() {
|
||||
GsonBuilder builder = new GsonBuilder();
|
||||
builder.setPrettyPrinting();
|
||||
|
|
@ -33,7 +32,11 @@ public class GsonService {
|
|||
}
|
||||
|
||||
public <T> T readJson(Type clazz, String filePath) throws FileNotFoundException {
|
||||
return gson.fromJson(new JsonReader(new FileReader(filePath)), clazz);
|
||||
return readJson(clazz, new File(filePath));
|
||||
}
|
||||
|
||||
public <T> T readJson(Type clazz, File file) throws FileNotFoundException {
|
||||
return gson.fromJson(new JsonReader(new FileReader(file)), clazz);
|
||||
}
|
||||
|
||||
public void exportJson(Object data, String filePath) throws IOException {
|
||||
|
|
|
|||
|
|
@ -72,4 +72,11 @@ public class VehicleService {
|
|||
|
||||
return propulsionTypeRepository.findAll();
|
||||
}
|
||||
|
||||
public VehicleBrandEntity addVehicleIfNotExists(String brandId, String name) {
|
||||
if(vehicleBrandRepository.findOneByBrandId(brandId).isPresent())
|
||||
return vehicleBrandRepository.getOneByBrandId(brandId);
|
||||
|
||||
return addVehicle(brandId, name);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ public class DeviceController {
|
|||
DeviceDto dto = new DeviceDto();
|
||||
dto.setId(v.getId());
|
||||
dto.setName(v.getName());
|
||||
dto.setDevicenumber(v.getDevicenumber());
|
||||
dto.setDeviceNumber(v.getDevicenumber());
|
||||
dto.setManufacturer(v.getManufacturer());
|
||||
|
||||
items.add(dto);
|
||||
|
|
|
|||
|
|
@ -4,15 +4,19 @@ import eu.csc.ODPAppVehOwnServer.models.VehicleBrandDto;
|
|||
import eu.csc.ODPAppVehOwnServer.models.VehicleModelDto;
|
||||
import eu.csc.ODPAppVehOwnServer.models.data.PropulsionTypeDto;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.entity.data.VehicleModelEntity;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.StorageService;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.VehicleService;
|
||||
import lombok.var;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.MediaType;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.PathVariable;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.springframework.util.StreamUtils;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
|
||||
import org.springframework.web.util.UriComponentsBuilder;
|
||||
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
|
|
@ -20,6 +24,9 @@ import java.util.List;
|
|||
@RequestMapping("vehicles")
|
||||
public class VehicleController {
|
||||
|
||||
@Autowired
|
||||
private StorageService storageService;
|
||||
|
||||
@Autowired
|
||||
private VehicleService vehicleService;
|
||||
|
||||
|
|
@ -31,14 +38,22 @@ public class VehicleController {
|
|||
|
||||
for (var v : vehicleService.findAllBrands()
|
||||
) {
|
||||
|
||||
VehicleBrandDto dto = new VehicleBrandDto();
|
||||
dto.setName(v.getName());
|
||||
dto.setId(v.getId());
|
||||
dto.setBrandId(v.getBrandId());
|
||||
|
||||
String url = ServletUriComponentsBuilder.fromCurrentRequest()
|
||||
|
||||
.path(dto.getBrandId())
|
||||
.toUriString();
|
||||
|
||||
dto.setImageUrl(url);
|
||||
|
||||
items.add(dto);
|
||||
|
||||
UriComponentsBuilder.fromUriString("/")
|
||||
.build();
|
||||
//ToDo add models?
|
||||
|
||||
}
|
||||
|
|
@ -46,6 +61,16 @@ public class VehicleController {
|
|||
return ResponseEntity.ok(items);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/brands/{brandId}", method = RequestMethod.GET,
|
||||
produces = MediaType.IMAGE_JPEG_VALUE)
|
||||
public void getImage(HttpServletResponse response, @PathVariable String brandId) throws IOException {
|
||||
|
||||
var imgFile = storageService.loadAsResource("images", "ford.jpeg");
|
||||
|
||||
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
|
||||
StreamUtils.copy(imgFile.getInputStream(), response.getOutputStream());
|
||||
}
|
||||
|
||||
|
||||
@GetMapping
|
||||
@RequestMapping(value = {"/models","/models/{brand}"})
|
||||
|
|
|
|||
|
|
@ -41,6 +41,7 @@ public class VehicleRegistrationController extends AbstractRestController {
|
|||
mapped.setModelId(userVehicle.getModel());
|
||||
mapped.setLicensePlate(userVehicle.getLicensePlate());
|
||||
|
||||
|
||||
result.add(mapped);
|
||||
|
||||
}
|
||||
|
|
@ -57,7 +58,8 @@ public class VehicleRegistrationController extends AbstractRestController {
|
|||
entity.setLicensePlate(body.getLicensePlate());
|
||||
entity.setModel(body.getModelId());
|
||||
entity.setBrand(body.getBrandId());
|
||||
entity.setCd_id(user.getUserId());
|
||||
entity.setUser_id(user.getUserId());
|
||||
entity.setVin(body.getVin());
|
||||
|
||||
entity = customerService.registerVehicle(entity);
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
package eu.csc.ODPAppVehOwnServer.web.clients;
|
||||
|
||||
import eu.csc.ODPAppVehOwnServer.client.clients.VehOwnAppClient;
|
||||
import eu.csc.ODPAppVehOwnServer.models.regist.UserVehicleRegistrationDto;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.entity.data.DeviceArticleEntity;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.entity.data.DeviceEntity;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.CustomerService;
|
||||
|
|
@ -15,6 +16,8 @@ public abstract class AbstractClientTester {
|
|||
|
||||
protected final DeviceEntity deviceA;
|
||||
protected final DeviceArticleEntity deviceArticleA;
|
||||
|
||||
protected final UserVehicleRegistrationDto customerVehicleA;
|
||||
@LocalServerPort
|
||||
protected int port;
|
||||
|
||||
|
|
@ -54,6 +57,12 @@ public abstract class AbstractClientTester {
|
|||
|
||||
this.deviceArticleA = new DeviceArticleEntity();
|
||||
this.deviceArticleA.setSerialNumber("AAA");
|
||||
|
||||
this.customerVehicleA = new UserVehicleRegistrationDto();
|
||||
customerVehicleA.setBrandId("ford");
|
||||
customerVehicleA.setModelId("focus");
|
||||
customerVehicleA.setVin("W0L000051T2123456");
|
||||
customerVehicleA.setLicensePlate("HS-BLUB001");
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -78,5 +87,10 @@ public abstract class AbstractClientTester {
|
|||
protected void initTestData(){
|
||||
|
||||
setUpDevices();
|
||||
setUpVehicles();
|
||||
}
|
||||
|
||||
private void setUpVehicles() {
|
||||
vehicleService.addVehicleIfNotExists("ford", "Ford");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,16 +2,23 @@ package eu.csc.ODPAppVehOwnServer.web.clients;
|
|||
|
||||
import eu.csc.ODPAppVehOwnServer.ODPAppVehOwnServerApplication;
|
||||
import eu.csc.ODPAppVehOwnServer.client.ClientFactory;
|
||||
import eu.csc.ODPAppVehOwnServer.models.regist.UserVehicleRegistrationDto;
|
||||
import lombok.var;
|
||||
import org.junit.jupiter.api.*;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ODPAppVehOwnServerApplication.class)
|
||||
|
||||
/**
|
||||
* @see eu.csc.ODPAppVehOwnServer.controller.registration.VehicleRegistrationController
|
||||
*/
|
||||
public class CustomerClientTester extends AbstractClientTester{
|
||||
|
||||
|
||||
@BeforeEach
|
||||
void init() throws IOException {
|
||||
|
||||
|
|
@ -53,4 +60,14 @@ public class CustomerClientTester extends AbstractClientTester{
|
|||
|
||||
System.out.println(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testRegisterVehicle() {
|
||||
var result = Assertions.assertDoesNotThrow(() ->
|
||||
client.registerCustomerVehicle(customerVehicleA));
|
||||
|
||||
Assertions.assertNotNull(result);
|
||||
|
||||
System.out.println(result);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,8 +1,11 @@
|
|||
package eu.csc.ODPAppVehOwnServer.shell;
|
||||
|
||||
import eu.csc.ODPAppVehOwnServer.models.VehicleBrandDto;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.DeviceService;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.GsonService;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.StorageService;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.VehicleService;
|
||||
import eu.csc.ODPAppVehOwnServer.persistence.services.storage.MetaDataStorageService;
|
||||
import lombok.var;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.shell.standard.ShellComponent;
|
||||
|
|
@ -10,11 +13,15 @@ import org.springframework.shell.standard.ShellMethod;
|
|||
import org.springframework.shell.standard.ShellOption;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.nio.file.Path;
|
||||
import java.util.List;
|
||||
|
||||
@ShellComponent
|
||||
public class InfoCommands extends BaseCommands{
|
||||
|
||||
private MetaDataStorageService metaDataStorageService;
|
||||
|
||||
@Autowired
|
||||
private VehicleService vehicleService;
|
||||
|
||||
|
|
@ -24,10 +31,13 @@ public class InfoCommands extends BaseCommands{
|
|||
@Autowired
|
||||
private GsonService gsonService;
|
||||
|
||||
@Autowired
|
||||
private StorageService storageService;
|
||||
|
||||
@ShellMethod(value = "Info", key = {"info"})
|
||||
public String info(){
|
||||
|
||||
|
||||
addMessageString(storageService.load("").toAbsolutePath().toString());
|
||||
return getMessageString();
|
||||
}
|
||||
|
||||
|
|
@ -41,12 +51,34 @@ public class InfoCommands extends BaseCommands{
|
|||
return getMessageString();
|
||||
}
|
||||
|
||||
@ShellMethod(value = "import Content", key = {"i_im"})
|
||||
public String doImport(@ShellOption String location){
|
||||
|
||||
@ShellMethod(value = "set location", key = {"i_set_loc"})
|
||||
public String setFolderDir(@ShellOption String location){
|
||||
Path p = new File(location).toPath();
|
||||
this.metaDataStorageService = new MetaDataStorageService(p);
|
||||
|
||||
return getMessageString();
|
||||
}
|
||||
|
||||
@ShellMethod(value = "import Content", key = {"i_im"})
|
||||
public String doImport(@ShellOption(defaultValue = ShellOption.NULL) String location) throws FileNotFoundException {
|
||||
|
||||
|
||||
List<VehicleBrandDto> brands = null;
|
||||
|
||||
if(location == null)
|
||||
brands = metaDataStorageService.openBrands();
|
||||
else
|
||||
brands = metaDataStorageService.openBrands(location);
|
||||
|
||||
|
||||
for (var brand:brands
|
||||
) {
|
||||
vehicleService.addVehicleIfNotExists(brand.getBrandId(), brand.getName());
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
addMessageString(p.toString());
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -34,7 +34,7 @@ public class DtoMapper {
|
|||
|
||||
var result = new CustomerDeviceDto();
|
||||
|
||||
result.setSerialnumber(item.getSerialNumber());
|
||||
result.setSerialNumber(item.getSerialNumber());
|
||||
result.setName(item.getName());
|
||||
result.setDeviceNumber(item.getDeviceNumber());
|
||||
|
||||
|
|
|
|||
Binary file not shown.
|
After Width: | Height: | Size: 6.3 KiB |
|
|
@ -104,8 +104,11 @@
|
|||
<manifestEntries>
|
||||
<retrofit_version>${retrofit.version}</retrofit_version>
|
||||
<creationTime>${maven.build.timestamp}</creationTime>
|
||||
|
||||
</manifestEntries>
|
||||
</archive>
|
||||
<outputDirectory>${project.basedir}/../../doc/generated</outputDirectory>
|
||||
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
<creationTime>${maven.build.timestamp}</creationTime>
|
||||
</manifestEntries>
|
||||
</archive>
|
||||
<outputDirectory>${project.basedir}/../../doc/generated</outputDirectory>
|
||||
</configuration>
|
||||
</plugin>
|
||||
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ public class VehicleBrandDto extends AbstractBaseDto{
|
|||
private Long id;
|
||||
private String brandId;
|
||||
private String name;
|
||||
private String imageUrl;
|
||||
|
||||
private List<VehicleModelDto> models;
|
||||
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ public class DeviceDto {
|
|||
|
||||
private Long id;
|
||||
|
||||
private String devicenumber;
|
||||
private String deviceNumber;
|
||||
private String manufacturer;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
package eu.csc.ODPAppVehOwnServer.models.regist;
|
||||
|
||||
import eu.csc.ODPAppVehOwnServer.models.AbstractBaseDto;
|
||||
import eu.csc.ODPAppVehOwnServer.models.data.DeviceDto;
|
||||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
|
|
@ -15,6 +14,6 @@ import lombok.ToString;
|
|||
public class CustomerDeviceDto extends AbstractBaseDto {
|
||||
|
||||
private String deviceNumber;
|
||||
private String serialnumber;
|
||||
private String serialNumber;
|
||||
private String name;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,10 +4,13 @@ import eu.csc.ODPAppVehOwnServer.models.AbstractBaseDto;
|
|||
import lombok.Getter;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.Setter;
|
||||
import lombok.ToString;
|
||||
|
||||
@Getter
|
||||
@Setter
|
||||
@NoArgsConstructor
|
||||
|
||||
@ToString
|
||||
public class CustomerVehicleDto extends AbstractBaseDto {
|
||||
|
||||
private String vin;
|
||||
|
|
|
|||
Loading…
Reference in New Issue