采取什么方法可以使我的代码更通用 Java/Spring?
What approach to take to make my code more generic Java/ Spring?
在 SpringBoot
应用程序中,我有一项服务(在 Spring 意义上)调用客户端,这些客户端通过调用与 createXXX
除了对象的性质在方法的输入处改变。
为简化起见,假设我对动物的创建进行建模:使用对象 CatDTO
、DogDTO
、HorseDTO
作为 Web 服务的输入。 AnimaslDTO
是由不同种类的动物组成的对象(没有继承关系)。
三个client我也是一样的,我们以猫为例
package com.animals.client;
import ...
@Service
public class CatClient {
private static final String CODE_WS_CREATE_CAT = "createCat";
/**
* Call RestFul WS for Cat Creation
* @param catDTO
*/
public ResponseEntity<String> createCat(CatDTO catDTO)
{
// ... Call a RestFul WS in the same manner for each animal. Only the parameter change in each client
// --> ie dogDTO in DogClient.createDog, HorseDTO in HorseClient.createHorse,
}
}
在 AnimalServiceImpl
实现的 AnimalService 中,我尝试创建三只动物
这是代码
package com.animals.service.impl;
import ...
@Service
public class AnimalServiceImpl implements AnimalService {
@Autowired
private CatClient catClient;
@Autowired
private DogClient dogClient;
@Autowired
private HorseClient horseClient;
@Override
public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
catClient.createCat(animalsDTO.getCat());
dogClient.createDog(animalsDTO.getDog());
horseClient.createHorse(animalsDTO.getHorse());
....
}
}
我想知道如何使用与 createXXX
非常相似的方法在 Spring 或 Java 中生成我的客户。我可以使用什么设计模式?我试过的是使用 Java 泛型,但它不太适合 Spring。我试图创建一个 AnimalClient(T)
class ,其中 T 是动物,但我在使用一个参数自动装配构造函数时遇到问题。
提前致谢!
除非你有 Inheritance
,否则即使你尝试使用 Generics
也无法有效地解决这个问题
这是一种简化代码的方法:
BaseAnimalDto
目前是一个标记界面。如果需要,可以在这里使用常用方法。
public interface BaseAnimalDTO {
}
CatDTO
public class CatDTO implements BaseAnimalDTO {
// Cat DTO code
}
创建一个BaseAnimalClient
如下
public interface BaseAnimalClient {
ResponseEntity<String> create(BaseAnimalDTO dto);
}
CatClient
看起来像这样
@Service
public class CatClient implements BaseAnimalClient {
private static final String CODE_WS_CREATE_CAT = "createCat";
@Override
public ResponseEntity<String> create(BaseAnimalDTO dto) {
return null;
}
}
让我们像这样创建一个通用 AnimalClient
:
@Service
public class AnimalClient implements BaseAnimalClient {
@Autowired
private CatClient catClient;
@Autowired
private DogClient dogClient;
@Autowired
private HorseClient horseClient;
@Override
public ResponseEntity<String> create(BaseAnimalDTO dto) {
BaseAnimalClient client;
if (dto instanceof CatDTO) {
client = catClient;
} else if (dto instanceof DogDTO) {
client = dogClient;
} else {
client = horseClient;
}
return client.create(dto);
}
}
现在,您的 AnimalServiceImpl
看起来像这样
@Service
public class AnimalServiceImpl implements AnimalService {
@Autowired
private AnimalClient animalClient;
@Override
public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
animalClient.create(animalsDTO.getCat());
animalClient.create(animalsDTO.getDog());
animalClient.create(animalsDTO.getHorse());
....
}
}
但是,如果您可以这样修改 AnimalsDTO
:
public class AnimalsDTO {
private List<? extends BaseAnimalDTO> animalDtos;
// getter, setters
}
那么,你的AnimalServiceImpl
会更简化成这样:
@Service
public class AnimalServiceImpl implements AnimalService {
@Autowired
private AnimalClient animalClient;
@Override
public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
for (BaseAnimalDTO animalDTO : animalsDTO.getAnimalDtos()) {
animalClient.create(animalDTO);
}
....
}
}
在 SpringBoot
应用程序中,我有一项服务(在 Spring 意义上)调用客户端,这些客户端通过调用与 createXXX
除了对象的性质在方法的输入处改变。
为简化起见,假设我对动物的创建进行建模:使用对象 CatDTO
、DogDTO
、HorseDTO
作为 Web 服务的输入。 AnimaslDTO
是由不同种类的动物组成的对象(没有继承关系)。
三个client我也是一样的,我们以猫为例
package com.animals.client;
import ...
@Service
public class CatClient {
private static final String CODE_WS_CREATE_CAT = "createCat";
/**
* Call RestFul WS for Cat Creation
* @param catDTO
*/
public ResponseEntity<String> createCat(CatDTO catDTO)
{
// ... Call a RestFul WS in the same manner for each animal. Only the parameter change in each client
// --> ie dogDTO in DogClient.createDog, HorseDTO in HorseClient.createHorse,
}
}
在 AnimalServiceImpl
实现的 AnimalService 中,我尝试创建三只动物
这是代码
package com.animals.service.impl;
import ...
@Service
public class AnimalServiceImpl implements AnimalService {
@Autowired
private CatClient catClient;
@Autowired
private DogClient dogClient;
@Autowired
private HorseClient horseClient;
@Override
public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
catClient.createCat(animalsDTO.getCat());
dogClient.createDog(animalsDTO.getDog());
horseClient.createHorse(animalsDTO.getHorse());
....
}
}
我想知道如何使用与 createXXX
非常相似的方法在 Spring 或 Java 中生成我的客户。我可以使用什么设计模式?我试过的是使用 Java 泛型,但它不太适合 Spring。我试图创建一个 AnimalClient(T)
class ,其中 T 是动物,但我在使用一个参数自动装配构造函数时遇到问题。
提前致谢!
除非你有 Inheritance
,否则即使你尝试使用 Generics
这是一种简化代码的方法:
BaseAnimalDto
目前是一个标记界面。如果需要,可以在这里使用常用方法。
public interface BaseAnimalDTO {
}
CatDTO
public class CatDTO implements BaseAnimalDTO {
// Cat DTO code
}
创建一个BaseAnimalClient
如下
public interface BaseAnimalClient {
ResponseEntity<String> create(BaseAnimalDTO dto);
}
CatClient
看起来像这样
@Service
public class CatClient implements BaseAnimalClient {
private static final String CODE_WS_CREATE_CAT = "createCat";
@Override
public ResponseEntity<String> create(BaseAnimalDTO dto) {
return null;
}
}
让我们像这样创建一个通用 AnimalClient
:
@Service
public class AnimalClient implements BaseAnimalClient {
@Autowired
private CatClient catClient;
@Autowired
private DogClient dogClient;
@Autowired
private HorseClient horseClient;
@Override
public ResponseEntity<String> create(BaseAnimalDTO dto) {
BaseAnimalClient client;
if (dto instanceof CatDTO) {
client = catClient;
} else if (dto instanceof DogDTO) {
client = dogClient;
} else {
client = horseClient;
}
return client.create(dto);
}
}
现在,您的 AnimalServiceImpl
看起来像这样
@Service
public class AnimalServiceImpl implements AnimalService {
@Autowired
private AnimalClient animalClient;
@Override
public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
animalClient.create(animalsDTO.getCat());
animalClient.create(animalsDTO.getDog());
animalClient.create(animalsDTO.getHorse());
....
}
}
但是,如果您可以这样修改 AnimalsDTO
:
public class AnimalsDTO {
private List<? extends BaseAnimalDTO> animalDtos;
// getter, setters
}
那么,你的AnimalServiceImpl
会更简化成这样:
@Service
public class AnimalServiceImpl implements AnimalService {
@Autowired
private AnimalClient animalClient;
@Override
public ResponseEntity<String> createAnimals(AnimalsDTO animalsDTO) {
for (BaseAnimalDTO animalDTO : animalsDTO.getAnimalDtos()) {
animalClient.create(animalDTO);
}
....
}
}