2012-10-19 16 views
5

Używam Spring 3.1 i napisać moją warstwę DAO i warstwę usługi (transakcyjnych).Dokonywanie Spring 3 Metoda kontrolera MVC Transactional

Jednak w wyjątkowym przypadku, aby uniknąć leniwego wyjątku init, muszę utworzyć metodę obsługi żądań wiosennych mvc @transactional. Ale nie dołącza transakcji do tej metody. Nazwa metody to ModelAndView home (żądanie HttpServletRequest, odpowiedź HttpServletResponse). http://forum.springsource.org/showthread.php?46814-Transaction-in-MVC-Controller Z tego linku wydaje się, że nie można dołączyć transakcji (domyślnie) do metod mvc. Rozwiązanie sugerowane w tym linku wydaje się być dla Spring 2.5 (przesłanianie handleRequest). Każda pomoc zostanie doceniona. Dzięki

@Controller 
public class AuthenticationController { 
@Autowired 
CategoryService categoryService;  
@Autowired 
BrandService brandService; 
@Autowired 
ItemService itemService; 

@RequestMapping(value="/login.html",method=RequestMethod.GET) 
ModelAndView login(){  
    return new ModelAndView("login.jsp");  
} 
@RequestMapping(value="/home.html",method=RequestMethod.GET) 
@Transactional 
ModelAndView home(HttpServletRequest request, HttpServletResponse response){ 
    List<Category> categories = categoryService.readAll(); 
    request.setAttribute("categories", categories);  
    List<Brand> brands = brandService.readAll(); 
    request.setAttribute("brands", brands);  
    List<Item> items = itemService.readAll(); 
    request.setAttribute("items", items); 
    Set<Image> images = items.get(0).getImages(); 
    for(Image i : images) { 
     System.out.println(i.getUrl()); 
    } 
    return new ModelAndView("home.jsp");  
} 
+0

Co starasz się wycofać tutaj? W funkcji kontrolera, w której zdefiniowano adnotację @Transaction, nie ma takiej operacji na bazie danych, którą można wycofać. Jestem zmieszany. –

+0

wszystkie wywołania serwisowe, takie jak categoryService.readAll(), są operacjami bazy danych – Subin

+0

Tak, ale nie można wycofać odczytanych danych. Co dokładnie próbujesz wycofać? –

Odpowiedz

4

musisz implementować interfejs tak, że wiosna ma coś można go używać jako interfejs Proxy:

@Controller 
public interface AuthenticationController { 
    ModelAndView home(HttpServletRequest request, HttpServletResponse response); 
} 

@Controller 
public class AuthenticationControllerImpl implements AuthenticationController { 

@RequestMapping(value="/home.html",method=RequestMethod.GET) 
@Transactional 
@Override 
ModelAndView home(HttpServletRequest request, HttpServletResponse response){ 
..... 
} 
} 
+0

dziękuję, że pracował – Subin

+0

Korzystanie SpringBoot 1.2.3.RELEASE ze sprężyną 4.1.6.RELEASE Napotykam dokładnie przeciwnie: Jeśli kontroler (@RequestMapping) formalnie implementuje interfejs, sprężyna tworzy JdkDynamicAopProxy (który uruchamia się bez błędów, ale dispatcher servlet nie znajduje punktów wejścia dla odwzorowań adresów URL w czasie wykonywania). Jeśli kontroler NIE formalnie implementuje interfejsu, generowany jest CglibAopProxy i wszystko działa idealnie. CGLib nie musi być wyraźną zależnością, w przeciwieństwie do komentarza chrismarx poniżej. – Heri

4

Wiosna będzie realizować logikę transakcyjnej za pomocą dynamicznych proxy JDK, to polegać na klasy proxy implementujące odpowiednie interfejsy. Możliwe jest również użycie serwerów proxy CGLib, które nie wymagają interfejsów.

Jest ładny artykuł o tym link

+0

Myślę, że to jest lepsza odpowiedź, Spring spróbuje stworzyć proxy cglib dla kontrolera, jeśli nie określisz interfejsu, i dopóki cglib jest w ścieżce klasy, to wszystko działa i nie musisz zajmować się zmianą byle co. Wpadłem na problemy z @requestmapping próbując uzyskać kontroler z interfejsem do pracy – chrismarx

Powiązane problemy