복붙노트

[SPRING] @Controller 클래스의 트랜잭션 메소드는 트랜잭션으로 간주되지 않습니다.

SPRING

@Controller 클래스의 트랜잭션 메소드는 트랜잭션으로 간주되지 않습니다.

다음은 @Controller로 표시된 클래스에서 작동하지 않는 것으로 나타났습니다.

@Autowired
SessionFactory sessionFactory;

@ResponseBody
@Transactional
@RequestMapping(method = RequestMethod.GET , value = "/map")

public ArrayList<PhotoDTO> getPhotos(...someParams) {
   Entity result sessionFactory.getCurrentSession()... //do some manipulation

  return result;
}

URL을 호출하면 메소드가 트랜잭션이 아니라는 오류가 발생합니다 (실제로 볼 수 있듯이이 메소드는 트랜잭션으로 표시됩니다)

이 메서드를 MyService라는 다른 클래스에 복사하고 컨트롤러에서 호출하면 완벽하게 작동합니다.

이것은 일종의 스프링 어드바이스인가? (더 많은 클래스를 더 많이 사용하게하는 음모)?

해결법

  1. ==============================

    1.컨트롤러에서 트랜잭션을 수행하지 마십시오. 서비스 계층 클래스에 넣으십시오.

    컨트롤러에서 트랜잭션을 수행하지 마십시오. 서비스 계층 클래스에 넣으십시오.

    코드를 model-view-controller로 분리하십시오.

    예, 그것은 음모입니다. 반복 코드없이 컨트롤러 / 뷰간에 코드를 공유 할 수 있습니다. 또한 트랜잭션의 롤백을 불필요하게 중지합니다 (실제 트랜잭션과 무관 한 예외의 경우).

    그것은 더 많은 코드처럼 보일지도 모르지만, 장기적으로는 개발하기가 훨씬 쉽고 간단합니다.

  2. ==============================

    2.ContextLoaderListener에 의해로드 된 주요 스프링 컨텍스트와 DispatcherServlet에 의해로드 된 하위 컨텍스트의 두 가지 응용 프로그램 컨텍스트가 있습니다. 또한 를 자식 컨텍스트에 의해로드 된 구성에도 넣어야합니다. 어쩌면 web.xml 파일을 보여 주면 더 많은 도움을받을 수 있습니다.

    ContextLoaderListener에 의해로드 된 주요 스프링 컨텍스트와 DispatcherServlet에 의해로드 된 하위 컨텍스트의 두 가지 응용 프로그램 컨텍스트가 있습니다. 또한 를 자식 컨텍스트에 의해로드 된 구성에도 넣어야합니다. 어쩌면 web.xml 파일을 보여 주면 더 많은 도움을받을 수 있습니다.

    어쨌든 @NimChimpsky는 컨트롤러 레이어에서 트랜잭션을 관리하는 것이 일반적으로 바람직하지 않다고 말합니다.

  3. from https://stackoverflow.com/questions/9616410/transactional-methods-in-controller-class-are-not-considred-as-transactional by cc-by-sa and MIT license