我有以下代码:
public interface CompanyRepository extends JpaRepository<Company, String> { }
我必须在我的服务界面中列出所有生成的方法,然后才能在控制器中使用它们吗?
public interface CompanyService { }
我想通过我的Service实现类使用存储库方法,但似乎没有办法。
答案 0 :(得分:2)
Spring Data JPA为您“动态”实例化您的存储库(具有魔力)。您可以找到一个回购实现,例如here。
因此,在通常情况下,没有必要重复您的仓库中所有这些方法。相反,您应该在其中添加自定义'query methods'。例如:
public interface CompanyRepo extends JpaRepository<Company, String> {
List<Company> findAllByName(String companyName);
}
Spring(再次具有其魔力)为您实现了此方法(您可以找到here有关如何创建此类方法的信息)。因此,您将拥有基本方法(save
,findAll
,findById
,delete
等)和自定义方法的仓库。
然后,您可以在交易服务中使用此存储库来实现业务逻辑:
@Service
@Transactional
public class CompanyService {
private final CompanyRepo companyRepo;
public CompanyService(CompanyRepo companyRepo) {
this.companyRepo = companyRepo;
}
public Company create(CompanyDto dto) {
Company company = dto.toCompany();
// Some custom logic...
return companyRepo.save(company);
}
}
然后在您的控制器中使用该服务:
@RestController
@RequestMapping("/companies")
public class CompanyController {
private final CompanyService companyService;
public CompanyController(CompanyService companyService) {
this.companyService = companyService;
}
@PostMapping
public ResponseEntity create(@RequestBody CompanyDto dto) {
return ResponseEntity.ok(companyService.create(dto));
}
}
答案 1 :(得分:1)
它们都在这里:Spring Docs。
不,不要直接在您的服务中公开,您的服务必须使用;即使在某些情况下(例如find\delete
等)也有简单的委托。
直接将它们暴露在您的控制器中会造成一些混乱,尤其是在测试时-因为您将需要模拟它们,对其进行测试等(并且已经对它们进行了弹簧测试)。当控制器仅与服务交互时,我发现它更干净,例如,这是在我们的项目中强制执行的。