Я создаю проект, который будет реагировать на сбор нескольких объектов 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
каждый раз, когда он хочет добавить другой контроллер.
Также не стесняйтесь ознакомиться с реализацией и дайте мне знать, есть ли у кого-нибудь альтернативные идеи или комментарии.
Примечание. Я уменьшаю количество кода в вопросе, чтобы его было легче понять, не понимая контекста фактических требований. Пожалуйста, дайте мне знать, если кому-то нужна дополнительная информация.