2014-12-09 2 views
0

아키텍처의 레이어가 손상되었는지 여부를 확인하기 위해 aspectj를 사용하려고합니다.aspectj 봄 부팅시 깨진 레이어 액세스 확인

이제는 de.fhb.controller 내에서 주석이 달린 autowired에 대한 모든 메소드 호출을 표시합니다.

하지만 어떻게하면 리포지토리로 제한 할 수 있습니까?

패키지 구조는 다음과 같습니다 등등

  • de.fhb.controller
  • de.fhb.service
  • de.fhb.entity 및합니다. 측면에 의해 확인되어야한다

    @Repository 
    public interface BoxRepository extends JpaRepository<Box, Long>{ 
    
        public List findByPrio(long prio); 
    } 
    

    및 컨트롤러 :

    @RequestMapping("/box") 
    @Controller 
    public class BoxController { 
    
    @Autowired 
    private BoxRepository boxRepository; // negative example 
    
    @Autowired 
    private BoxService boxService; 
    
    @RequestMapping(value = "/") 
    public String list(Model model) { 
        List boxes = boxRepository.findAll(); // negativ example 
        model.addAttribute("boxes", boxes); 
        return "box/list"; 
    } 
    

    더 룩 :

내 측면이

@Aspect 
public class Layer { 

@DeclareError("within(de.fhb.controller..*) && @annotation(org.springframework.beans.factory.annotation.Autowired) ") 
private static final String typeWarning = "You try to access through many layers"; 

} 

저장소처럼 보이는 repository at github

패키지 de.fhb.controller 또는 de.fhb.repository.BoxRepository의 반환 유형이 하위 패키지에있는 모든 방법을 절편하지만 코드에서 그러한 방법입니다 :

답변

0

포인트 컷은

within(de.fhb.controller..*) && 
execution(de.fhb.repository.BoxRepository *(..)) 

은 산문에 의미합니다. 따라서 컴파일러 오류가 표시되지 않습니다.

;-)


업데이트 답 질문 업데이트 후 : 당신은 @Repository 주석 유형의 방법에 대한 호출을 차단해야 할

:

within(de.fhb.controller..*) && 
call(* (@org.springframework.stereotype.Repository *).*(..)) 

그러나 in orde r을하기 위해서는 Spring AOP에서 컴파일 시간 짜임새로 AspectJ로 바꿔야한다. 즉, AspectJ 컴파일러 Ajc을 사용하여 aspect를 컴파일하고 직조해야한다. 이유는 Spring AOP가 call() 포인트 컷을 지원하지 않기 때문입니다. 그러나 이것이 필요한 것입니다. execution() pointcut은 여기서는 도움이되지 않지만 Spring AOP와 같은 프록시 기반 "AOP lite"프레임 워크가 지원하는 유일한 도구입니다. AspectJ로이 부분을 만들어야하고 다른 부분은 여전히 ​​Spring AOP를 사용할 수있다. 그러나 AspectJ가 당신의 다른 측면을 선택하지 않도록주의해야합니다.

+0

나는 그것을 내 질문에 편집했습니다. –

+0

그에 따라 답변을 업데이트했습니다. – kriegaex

+0

예, 우리는 이미 fullblown AspectJ를 추가 했으므로 호출이 작동합니다. 고맙습니다! –

관련 문제