gpt4 book ai didi

java - 自动转换为多个域对象的集中式 bean

转载 作者:IT老高 更新时间:2023-10-28 13:47:26 36 4
gpt4 key购买 nike

我正在创建一个项目,它将响应收集多个 bean 对象,将其保存到数据库并返回事务的状态。可以从客户端发送多个对象。对于每个对象,它们都有单独的数据库,因此也有单独的 Controller 。

所以我计划创建一个框架,它可以接受来自多个 Controller 的多个对象,并且只发送一个集中式对象。但我不确定如何在 Controller 中使用集中对象作为返回类型(目前我将它们返回为 Object)。以下是我的代码:

Controller :

@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);
}
}

服务:

@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);
}
}

在服务中,我返回了 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;
}
}

总而言之,可能有多个类似于 PlayerValue 的实体。我需要一种将结果返回到集中式 bean 的方法。上面的过程工作,但为此我必须在 Controller 中将返回类型作为 Object。有谁知道我如何在 Controller 中使用返回类型作为 List 或 T 。我也知道它可以通过实现 ValueConverter 接口(interface)来完成,但是这种转换很简单。因此,如果任何其他开发人员不必在每次想要添加不同的 Controller 时都实现 ValueConverter,那就太好了。

还可以随时查看实现情况,如果有人有其他想法或意见,请告诉我。

注意:我减少了问题中的大量代码,以便在不了解实际需求上下文的情况下更容易理解。如果有人需要更多信息,请告诉我。

最佳答案

经过一些研究,我发现了一个更好的框架设计解决方案(但当然有缺陷),以实现向多个域对象的集中式 bean 的转换是使用标记接口(interface)。

Marker 接口(interface)可以为所有的bean 提供一个集中的类型。客户端需要遵循的主要规则是实现该标记接口(interface)。所以基本的解决方案是

标记界面:

public interface StateResponseValue<T> {
}

在所有bean中实现接口(interface)。

public class PlayerValue implements StateResponseValue<PlayerValue> {
}

public class ResponseValue<T> implements StateResponseValue<T> {

//fields and their getter and setter
}

更改服务和 Controller 的返回类型。

public interface StatService<T> {
StateResponseValue<T> findByNumber(String number);
}

更改 Controller 中的返回类型

@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);
}
}

注意:我觉得主要的缺点是,每当我们要访问字段时,客户端都需要显式地将对象强制转换为 ResponseValue,这仍然很丑陋。

关于java - 自动转换为多个域对象的集中式 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51381023/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com