Я создаю проект, который будет реагировать на сбор нескольких объектов 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);
}
}
Обслуживание:
@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 но я хочу, чтобы этот объект был PlayerValue в централизованный компонент 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. Мне нужен способ вернуть результат в централизованном компоненте. Над работой над процессом, НО для этого я должен предоставить возвращаемый тип как Object in Controller. У кого-нибудь есть идея, как я могу использовать возвращаемый тип как List или T в контроллере. Также я знаю, что это можно сделать, реализовав интерфейс ValueConverter, но это преобразование является простым. Поэтому было бы неплохо, если бы любой другой разработчик не должен был внедрять ValueConverter каждый раз, когда он хочет добавить другой контроллер.
Также не стесняйтесь ознакомиться с реализацией и дайте мне знать, есть ли у кого-нибудь альтернативные идеи или комментарии.
Примечание. Я уменьшаю количество кода в вопросе, чтобы его было легче понять, не понимая контекста фактических требований. Пожалуйста, дайте мне знать, если кому-то нужна дополнительная информация.