2015-08-31 3 views
2

Я пытаюсь запросить список клиентов как json из контроллера весны. когда я обращаюсь к url, я могу получить список без ошибок.HTTP Status 500 - не удалось лениво инициализировать коллекцию роли: ..., не удалось инициализировать прокси-сервер - нет Сессия

-CustomerController

@RequestMapping("getCustomerListRB") 
public @ResponseBody List<Customer> getCustomerListsRB() { 
    List<Customer> cusList = new ArrayList<Customer>(); 
    cusList = cusService.getList(); 
    return cusList; 
} 

, но когда я пытаюсь соединить таблицу в модели клиента -Customer.java

@OneToMany(mappedBy = "Customer", cascade = CascadeType.ALL) 
    private List<MainOrder> MainOrder; 

    public List<MainOrder> getMainOrder() { 
     return MainOrder; 
    } 
    public void setMainOrder(List<MainOrder> mainOrder) { 
     MainOrder = mainOrder; 
    } 

запустить сервер снова есть ошибка, как ниже:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: failed to lazily initialize a collection of role: com.mdr.model.Customer.mainOrders, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.mdr.model.Customer["mainOrders"]); nested exception is com.fasterxml.jackson.databind.JsonMappingException: failed to lazily initialize a collection of role: com.mdr.model.Customer.mainOrders, could not initialize proxy - no Session (through reference chain: java.util.ArrayList[0]->com.mdr.model.Customer["mainOrders"]) 
    org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.writeInternal(MappingJackson2HttpMessageConverter.java:256) 
    org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208) 
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:143) 
    org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:89) 
    org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:193) 
    org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:122) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

После добавления fetch = FetchType.EAGER, как показано ниже

@OneToMany(mappedBy = "Customer", cascade = CascadeType.ALL,fetch = FetchType.EAGER) 

Я запускаю сервер снова, у него нет ошибки, но невозможно получить данные. пожалуйста помогите !

ответ

1

Прежде всего, вам нужна транзакция, которая прослужит достаточно долго, чтобы сеанс был доступен для ленивой выборки связанных объектов. В вашем примере вы возвращаете список объектов с необработанными связанными сущностями за пределами области транзакции (внутренние элементы Spring преобразуют список в JSON после завершения транзакции - вот почему он не работает).

Вы можете выполнить одно из следующих действий:

  1. Пропустить ленивости в ваших отношениях, так как все связанные объекты должны быть выбраны в любом случае prerpare полный ответ в формате JSON.
  2. Измените свой метод: «String getCustomerListsRB()» и используйте ObjectMapper для сериализации «List» в JSON самостоятельно (вы можете автоустановить ObjectMapper на свой контроллер).
  3. Попытайтесь использовать Open Session In View, но я сильно препятствую вам использовать этот подход, поскольку он влияет на производительность, поскольку соединения с базой данных хранятся дольше, чем необходимо.
+0

добавить @Transactional на «Список getCustomerListsRB 'и измените что-нибудь такое же, но оно все равно ошибка –

+0

Опубликуйте stacktrace после добавления @Transactional, пожалуйста. –

+0

Извините, что такое stacktrace? –

1

У меня такое же исключение при использовании jackson с пружиной. Добавьте @jsonignore в поле, объявленное как ленивое или создающее циклическую зависимость в классе сущности. Убедитесь, что вы используете jsonignore той же библиотеки (codehaus/jackson/..) во всех слоях вашего приложения.

0

Посмотрите: Spring MVC :could not initialize proxy - no Session (through reference chain:

В качестве решения можно использовать добавление сущность аннотацию для предотвращения ленивой инициализации

@Entity @Table(name="Country") **@Proxy(lazy = false)** public class Country {} 

или использовать @JsonBackReference в отображении

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

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