java在服务中传递一个参数,该参数允许我使用一种方法而不是另一种方法
是否可以在允许我使用一种方法而不是另一种方法的服务中传递参数
下面是一个控制器和一个服务。我想传递一个(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);
}
}
}
我知道不是那样的,但让你明白我的目的是对的
# 1 楼答案
如果在
application.properties
文件中指定与persistenceType
相对应的属性,则允许在mybatis
和jpa
之间动态切换有关更多信息,这里有一些文档:
https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config
# 2 楼答案
这是完全可能的。首先,我将创建一个
PersistenceType
枚举:然后您需要声明您需要在POST端点中接收一个
PersistenceType
,并将其传递给底层ManufacturerService
,如下所示:最后一件事是更改
ManufacturerService
以接受save方法中的附加参数:建议将
persistenceType
包含在请求主体中,而不是作为单独的查询参数。它按原样工作,但如果所有内容都在请求体中传递(或作为路径变量传递),则API的使用者将更简洁、更容易理解