在 SpringBoot
应用程序中,我有一个服务(在 Spring 意义上),它通过调用与 createXXX
相同的函数来调用本身使用 RestFul Web 服务的客户端,除了对象的性质在方法的输入处发生变化。
为了简化起见,我们假设我对动物的创建进行建模:使用对象 CatDTO
、DogDTO
、HorseDTO
作为 Web 服务的输入。 AnimaslDTO
是由不同类型的动物组成的对象(没有继承关系)。
我以相同的方式创建三个客户端让我们以猫为例
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());
....
}
}
我想知道如何在 Spring 或 Java 中为与 createXXX
非常相似的方法生成我的客户端。我可以使用什么设计模式?我尝试过使用Java泛型,但它不太适合Spring。我尝试创建一个 AnimalClient(T) 类,其中 T 是动物,但在使用一个参数 Autowiring 构造函数时遇到问题。
提前致谢!
最佳答案
除非你有继承
,否则即使你尝试使用泛型
也无法有效地解决这个问题
这是简化代码的一种方法:
BaseAnimalDto
目前是一个标记接口(interface)。如果您愿意,您可以在这里使用常用方法。
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);
}
....
}
}
关于java - 采取什么方法使我的代码更通用 Java/Spring?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59503724/