有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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);
        }
    }
}

我知道不是那样的,但让你明白我的目的是对的


共 (2) 个答案

  1. # 2 楼答案

    这是完全可能的。首先,我将创建一个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以接受save方法中的附加参数:

    @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的使用者将更简洁、更容易理解