2015-05-27 3 views
0

Я начал создавать приложения с Спринг-Роо 1.3.1 и Спринг-Security 3.1.7Spring LazyInitializationException при использовании «переадресовать» в контроллере

Я использую Spring OpenEntityManagerInViewFilter, чтобы быть в состоянии сделать отложенную загрузку моего домена объекты.

Это прекрасно работает. Тем не менее, я столкнулся следующая проблема при выполнении редирект из контроллера:

@RequestMapping(method = RequestMethod.PUT, produces = "text/html") 
public String update(@Valid Service service, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest) { 
    if (bindingResult.hasErrors()) { 
     populateEditForm(uiModel, service); 
     return "services/update"; 
    } 
    uiModel.asMap().clear(); 
    serviceRepository.save(service); 
    return "redirect:/services/" + encodeUrlPathSegment(service.getId().toString(), httpServletRequest); 
} 

Это перенаправление return "redirect:/services/" + encodeUrlPathSegment(service.getId().toString(), httpServletRequest); не удается с LazyInitializationException. Он не работает при выполнении цепочки фильтров после совершения фиксации и происходит перенаправление. Переадресованный URL работает при прямом доступе.

При использовании return "forward:/services/" + encodeUrlPathSegment(service.getId().toString(), httpServletRequest); страница загружена просто отлично.

Я действительно не знаю, почему сеанс спящего режима недоступен при использовании «перенаправления». Еще одна странная вещь: активизация регистрации DEBUG для org.springframework.security.web также отлично работает.

например. log4j.logger.org.springframework.security.web=DEBUG

Я уже искал в интернете какие-то намеки, но обычно ленивая загрузка работает в моем приложении, это просто в этом случае, и в настоящее время я не совсем понимаю почему.

Любые комментарии/подсказки приветствуются.

Благодаря Стефан

+0

Проведенные дополнительные исследования и обнаружили, что метод, созданный Roo, «toString» использует метод ReflectionToStringBuilder.toString'. Это, похоже, вызывает проблему, так как во время перенаправления сеанс недоступен для этого метода. Это происходит только в объекте Domain Domain, загруженном во время инициализации Spring Security. Все еще не знаю, почему работает «forward:» в методе обновления. Любые идеи? Какая разница? – Stefan

ответ

0

Попробуйте изменить контроллер, как это:

@RequestMapping(method = RequestMethod.PUT, produces = "text/html") 
public String update(@Valid Service service, BindingResult bindingResult, 
      Model uiModel, HttpServletRequest httpServletRequest) { 
     if (bindingResult.hasErrors()) { 
      populateEditForm(uiModel, service); 
      return "services/update"; 
     } 
     uiModel.asMap().clear(); 
     Service attached = serviceRepository.save(service); 
     return "redirect:/services/" + 
      encodeUrlPathSegment(attached.getId().toString(), 
      httpServletRequest); 
} 

Экземпляр service является создание с помощью Spring вяжущего для отображения значений запроса на объект, но он не не привязан к EntityManager (нет дб сессия). Когда вы вызываете save, вы получаете экземпляр attached (экземпляр, управляемый entityManager), поэтому, если вы попытаетесь получить какое-либо ленивое свойство из этого экземпляра, он знает, как это сделать.

Дополнительную информацию о объектах JPA live cycle here.

Удачи вам!

Смежные вопросы