Поскольку все ваши значения могут быть представлены строкой, вы можете сделать следующее:
public static Object getAccountDetails(String primaryKey, Class<?> targetClass) {
Optional<?> result;
switch(targetClass.getSimpleName())
{
case "Group":
result = Test.dummyFind(primaryKey);
break;
case "User":
result = Test.dummyFind(primaryKey);
break;
default:
throw new IllegalArgumentException("The provided class: "+targetClass.getCanonicalName()+" was not a valid class to be resolved by this method.");
}
if(result.isPresent())
{
logger.info(String.format("Group with id %s does not exist", groupId));
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group Not Found");
}
return result.get();
}
Насколько мне известно, нет необходимости проверять, включен ли в регистраторе уровень информации, поскольку это определяется вашей конфигурацией входа в систему. Поэтому, если нет записи в журнал для информации, она не будет зарегистрирована.
Использование функции будет примерно таким (классы случайны, так как я хотел выделить подсветку синтаксиса):
UserDataHandler data = (UserDataHandler) getAccountDetails("1234", UserDataHandler.class);
Это не зависит от какой-либо функциональности Spring, поскольку я с ней не работаю. <?>
- оператор с подстановочным знаком. Поскольку ваш результат, однако, является содержимым Optional, вы должны вернуть Object, который затем должен быть проанализирован в соответствии с типом.
Двумя способами: Либо вы используете такой реестр:
public static Object getAccountDetails(Object primaryKey, Class<?> targetClass) {
Optional<?> result;
// This map should be acquired from a Singleton where you register these classes once in @PostConstruct.
Map<String, Method> methodMap = new TreeMap<>();
try {
methodMap.put("UserDataHandler", Test.class.getMethod("dummyFind"));
} catch (NoSuchMethodException | SecurityException e) {}
if(methodMap.containsKey(targetClass.getName()))
{
Method method = methodMap.get(targetClass.getName());
try {
result = (Optional<?>) method.invoke(primaryKey);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// do some more error handling
return null;
}
}
else throw new IllegalArgumentException("The provided class: "+targetClass.getCanonicalName()+" was not a valid class to be resolved by this method.");
if(!result.isPresent())
{
logger.info(String.format("Group with id %s does not exist", groupId));
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group Not Found");
}
return result.get();
}
или даже более умный метод - просто всегда называть методы в одном и том же шаблоне, чтобы любой получал целевой репозиторий Class.forName(String)
:
public static Object getAccountDetails(Object primaryKey, Class<?> targetClass) {
Optional<?> result;
Class<?> myRepository = Class.forName(targetClass.getSimpleName()+"Repository");
String methodName = "findBy"+targetClass.getName();
try
{
Method findMethod = targetClass.getMethod(methodName);
result = (Optional<?>) findMethod.invoke(primaryKey);
}
catch (NoSuchMethodException e){throw new IllegalArgumentException("The method "+methodName+" couldn't be found in the repository");}
catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {return null;}
if(!result.isPresent())
{
logger.info(String.format("Group with id %s does not exist", groupId));
throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Group Not Found");
}
return result.get();
}
Для обоих методов ваша функция поиска должна принимать Объект как аргумент, который должен быть приведен, чтобы использовать его:
public static Optional<Long> dummyFind(Object primaryKey)
{
long typedPrimaryKey = (long) primaryKey;
return Optional.of(typedPrimaryKey);
}
Но, поскольку я подумал об этом дважды, все, что вы хотите, уже существует: EntityManager.find(Class<T> entityClass,Object primaryKey)