在服务中传递一个参数,该参数允许我使用一种方法而不是另一种方法



是否可以在服务中传递一个参数,使我可以使用一种方法而不是另一种方法?

下面是控制器和服务。我想传递一个(persistenceType(参数,该参数允许我使用mybatis而不是jpa。我将在REST调用中将其作为queryparam传递。

@Service
public class ManufacturerService implements IManufacturerService {
@Autowired
private ManufacturerRepository manufacturerRepository;
@Autowired
private ManufacturerMapper manufacturerMapper;
@Override
@Transactional
public Manufacturer save(Manufacturer manufacturer) {
//if persistenceType.equals(MYBATIS) 
//manufacturerMapper.insert(manufacturer);
//else manufacturerRepository.save(manufacturer);

manufacturerMapper.insert(manufacturer);
return null;
//return manufacturerRepository.save(manufacturer);
}
}
@RestController
@RequestMapping("/manufacturers")
public class ManufacturesController {
public static final Logger LOG = LogManager.getLogger(ManufacturesController.class);
@Autowired
private ManufacturerService manufacturerService;
@PostMapping
public ResponseEntity<Manufacturer> createManufacturer(@RequestBody ManufacturerDTO manufacturer, @Param persistenceType) {
LOG.info("START - createManufacturer");
try {
Manufacturer _manufacturer = ManufacturerMapper.toEntity(manufacturer);
manufacturerService(persistenceType).save(_manufacturer);
LOG.info("STOP - createManufacturer");
return new ResponseEntity<>(_manufacturer, HttpStatus.CREATED);
} catch (Exception e) {
LOG.error("Error description: ", e);
LOG.info("STOP - createManufacturer");
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

我知道不是这样的,但让你明白我的目的是什么是正确的。

这是完全可能的。我将首先创建一个PersistenceType枚举:

enum PersistenceType {
JPA,
MYBATIS
}

然后,您需要声明您需要在POST端点中接收PersistenceType,并将其传递给底层ManufacturerService,如下所示:

@RestController
@RequestMapping("/manufacturers")
public class ManufacturesController {
public static final Logger LOG = LogManager.getLogger(ManufacturesController.class);
@Autowired
private ManufacturerService manufacturerService;
@PostMapping
public ResponseEntity<Manufacturer> createManufacturer(@RequestBody ManufacturerDTO manufacturer, @RequestParm(required = true) PersistenceType persistenceType) {
LOG.info("START - createManufacturer");
try {
Manufacturer _manufacturer = ManufacturerMapper.toEntity(manufacturer);
manufacturerService.save(_manufacturer, persistenceType);
LOG.info("STOP - createManufacturer");
return new ResponseEntity<>(_manufacturer, HttpStatus.CREATED);
} catch (Exception e) {
LOG.error("Error description: ", e);
LOG.info("STOP - createManufacturer");
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}

最后一件事是更改ManufacturerService以接受保存方法中的附加参数:

@Service
public class ManufacturerService implements IManufacturerService {
@Autowired
private ManufacturerRepository manufacturerRepository;
@Autowired
private ManufacturerMapper manufacturerMapper;
@Override
@Transactional
public Manufacturer save(Manufacturer manufacturer, PersistenceType persistenceType) {
if (persistenceType.equals(PersistenceType.MYBATIS)) {
return manufacturerMapper.insert(manufacturer);
} else {
return manufacturerRepository.save(manufacturer);
}
}
}

作为一个建议,我会在请求主体中包含persistenceType,而不是作为一个单独的查询参数。它按原样工作,但如果所有内容都在请求主体中传递(或作为路径变量传递(,那么API的消费者会更简洁、更容易理解它。

如果在application.properties文件中指定与persistenceType相对应的属性,则可以在mybatisjpa之间动态切换。

有关详细信息,这里有一些文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-配置

最新更新