Spring数据存储库-方法签名

时间:2018-08-11 10:10:06

标签: java spring jpa spring-data-jpa

我有以下代码:

public interface CompanyRepository extends JpaRepository<Company, String> { }
  • 在哪里可以查看此生成的方法?
  • 我必须在我的服务界面中列出所有生成的方法,然后才能在控制器中使用它们吗?

    public interface CompanyService { }
    

我想通过我的Service实现类使用存储库方法,但似乎没有办法。

2 个答案:

答案 0 :(得分:2)

Spring Data JPA为您“动态”实例化您的存储库(具有魔力)。您可以找到一个回购实现,例如here

因此,在通常情况下,没有必要重复您的仓库中所有这些方法。相反,您应该在其中添加自定义'query methods'。例如:

public interface CompanyRepo extends JpaRepository<Company, String> {
    List<Company> findAllByName(String companyName);
}

Spring(再次具有其魔力)为您实现了此方法(您可以找到here有关如何创建此类方法的信息)。因此,您将拥有基本方法(savefindAllfindByIddelete等)和自定义方法的仓库。

然后,您可以在交易服务中使用此存储库来实现业务逻辑:

@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等)也有简单的委托。

直接将它们暴露在您的控制器中会造成一些混乱,尤其是在测试时-因为您将需要模拟它们,对其进行测试等(并且已经对它们进行了弹簧测试)。当控制器仅与服务交互时,我发现它更干净,例如,这是在我们的项目中强制执行的。