Deb*_*was 11 java aop spring design-patterns spring-boot
我正在创建一个项目,它将响应收集多个bean对象,将其保存到数据库并返回事务的状态.可以从客户端发送多个对象.对于每个对象,它们具有单独的数据库,因此是单独的控
所以我计划创建一个框架,它可以接受来自多个控制器的多个对象,并只发送一个集中对象.但我不知道如何在控制器中使用集中对象作为返回类型(目前我将它们作为返回Object).以下是我的代码:
控制器:
@RestController
@RequestMapping("/stat/player")
public class PlayerController {
@Autowired
private StatService<PlayerValue> statPlayer;
@RequestMapping("/number/{number}")
public Object findByNumber(@PathVariable String number) { // Here returning Object seem odd
return statPlayer.findByNumber(number);
}
}
Run Code Online (Sandbox Code Playgroud)
服务:
@Service
@Transactional(isolation = Isolation.READ_COMMITTED)
public class PlayerServiceImpl implements StatService<PlayerValue> {
@Autowired
private PlayerRepository repository;
@Override
public PlayerValue findByNumber(String number) {
Optional<PlayerEntity> numberValue = repository.findByNumber(number);
return numberValue.map(PlayerEntity::toValue).orElse(null);
}
}
Run Code Online (Sandbox Code Playgroud)
在服务中我返回了PlayerValue对象,但我想将此对象包装到集中式Bean ResponseValue中.我为此创造了一个方面
@Aspect
@Component
public class Converter {
private static final Logger LOG = LoggerFactory.getLogger(Converter.class);
@Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
public void restControllerClassMethod() {}
private <T> ResponseValue<T> convert(List<T> results) {
String message = results.isEmpty() ? "No result found" : ResponseValueStatus.OK.toString();
return new ResponseValue<>(ResponseValueStatus.OK, message, results);
}
@Around("restControllerClassMethod()")
@SuppressWarnings("unchecked")
public <T> ResponseValue<T> convert(ProceedingJoinPoint joinPoint) {
ResponseValue value;
try {
Object findObject = joinPoint.proceed();
List<Object> objects = toList(findObject);
value = convert(objects);
} catch (NullPointerException e) {
throw new StatException(String.format("Exception thrown from %s from %s method with parameter %s", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), joinPoint.getArgs()[0].toString()));
//this exception will go in a controller advice and create a response value with this message
} catch (Throwable e) {
LOG.error("Exception occurred while converting the object", e);
throw new StatException(String.format("Exception thrown from %s from %s method with parameter %s with exception message %s", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName(), joinPoint.getArgs()[0].toString(), e.getMessage()));
}
return value;
}
private List<Object> toList(Object findObject) {
List<Object> objects = new ArrayList<>();
if (findObject instanceof List) {
((List) findObject).forEach(item -> objects.add(findObject));
} else {
objects.add(findObject);
}
return objects;
}
}
Run Code Online (Sandbox Code Playgroud)
总而言之,可能有多个类似于PlayerValue的实体.我需要一种方法将结果返回到集中式bean中.上述过程的工作,但为了这个,我得给返回类型Object在Controller.有没有人知道如何在控制器中使用返回类型作为List或T. 我也知道可以通过实现ValueConverter接口来完成,但这种转换很简单.因此,如果任何其他开发人员不必ValueConverter每次都想要添加不同的控制器来实现它,那将是很好的.
也可以随意查看实施情况,并告诉我是否有人有其他想法或一些意见.
注意:我减少了问题中的大量代码,以便在不了解实际需求上下文的情况下更容易理解.如果有人需要更多信息,请告诉我.
经过一些研究,我发现了一个更好的框架设计解决方案(但当然有缺陷),以实现多个域对象到集中式 bean 的转换,即使用标记接口。
标记接口可以为所有bean提供集中类型。客户端需要遵循的主要规则是实现该标记接口。所以基本的解决办法是
标记接口:
public interface StateResponseValue<T> {
}
Run Code Online (Sandbox Code Playgroud)
在所有bean 中实现该接口。
public class PlayerValue implements StateResponseValue<PlayerValue> {
}
public class ResponseValue<T> implements StateResponseValue<T> {
//fields and their getter and setter
}
Run Code Online (Sandbox Code Playgroud)
更改服务和控制器中的返回类型。
public interface StatService<T> {
StateResponseValue<T> findByNumber(String number);
}
Run Code Online (Sandbox Code Playgroud)
更改控制器中的返回类型
@RestController
@RequestMapping("/stat/player")
public class PlayerController {
@Autowired
private StatService<PlayerValue> statPlayer;
@RequestMapping("/number/{number}")
public StateResponseValue<T> findByNumber(@PathVariable String number) { // Here returning Object seem odd
return statPlayer.findByNumber(number);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我觉得主要的缺点是,每当我们想要访问字段时,客户端都需要显式地将对象强制转换为ResponseValue仍然相当难看的对象。
| 归档时间: |
|
| 查看次数: |
153 次 |
| 最近记录: |