Как работать с двумя различными коллекциями Spring Mongo одинаковой структуры, используя один класс сущностей и один универсальный репозиторий Mongo
Выпуск:
Spring создает две коллекции в mongodb с именем сотрудника суперкласса, менеджером и супервайзером базового класса. Я хочу запретить создание коллекции для сотрудника суперкласса в Монго ДБ к веснеЯ работаю над подпружиненным плагином JPA Mongodb Maven.
Я пытаюсь выполнить операцию вставки в Mongo Collection Manager и Supervisor, используя только один общий репозиторий и один и тот же класс супер-сущностей.
manager
{
id:"abc",
name:"Deva",
age:26
}
supervisor
{
id:"abc",
name:"Raj",
age:25
}
Это мой класс сотрудников, который является суперклассом, который будет расширен классом моего менеджера и руководителя
public @Data class Employee
{
private String id;
private String name;
private int age;
}
Класс менеджера привязан к менеджеру коллекции
@JsonInclude(JsonInclude.Include.NON_NULL)
@Document(collection="manager")
public @Data class Manager extends Employee
{
}
Класс Supervisor привязан к руководителю коллекции
@JsonInclude(JsonInclude.Include.NON_NULL)
@Document(collection="supervisor")
public @Data class Supervisor extends Employee
{
}
Реализация универсального интерфейса с одним методом save() для сохранения документа в коллекцию
public interface EmployeeService<T>
{
public T save(T employee);
}
@Service
public class EmployeeServiceImpl<T> implements EmployeeService<T>
{
@Autowired
EmployeeRepository employeeRepository;
@Override
public T save(T obj) {
return (T) employeeRepository.save(obj);
}
}
Я создал репозиторий EmployeeRepository, который является универсальным и может использоваться как для документа по сбору документов менеджера, так и руководителя.
public interface EmployeeRepository<T extends Employee> extends MongoRepository<T, String> {
{
}
Это мой компонент, который будет вызывать, чтобы сохранить сотрудника в коллекции менеджера или руководителя монго.
@Component
public class EmployeeComponent<T>
{
@Autowired
EmployeeService employeeService;
private boolean updateEmployee(Employee employee) throws Exception
{
Employee employees= employeeService.save(employee);
if (employees.isEmpty())
{
System.out.println("Failed to save employees.");
return "Failed to save employees.";
}
else
{
System.out.println("Success.");
return "Success.";
}
}
}
Это мой контроллер, вызывающий функцию сохранения и переданный объект сотрудника или руководителя на основе условия
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
EmployeeComponent<?> employeeComponent;
@Autowired
ObjectMapper mapper;
@RequestMapping(value="save/employee", method=RequestMethod.POST)
public ResponseEntity<String> updateEmployee(@RequestBody String employeeString) throws ParseException, Exception
{
try
{
Employee emp;
boolean isEmployeeManager = true;
> //Logic to convert string to class obj using ObjectMapper;
if(isEmployeeManager)
{
emp = mapper.readValue(employeeString, Manager.class);
}
else
{
emp = mapper.readValue(employeeString, Supervisor.class);
}
return employeeComponent.updateEmployee(emp);
}
catch(Exception e)
{
e.printStackTrace();
}
}
}