не может преобразовать clob в строку

Я пытаюсь преобразовать свой объект clob в строку, чтобы отобразить это на моей странице JSTL, для чего я пишу следующий код

public String convertClobToString(Clob clob){
     String toRet="";
     if(clob!=null)
     {
         try
         {
             long length=clob.length();
             toRet=clob.getSubString(1, (int)length);
         }
         catch(Exception ex)
         {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
             ex.printStackTrace();
         }
     }
     return toRet;
 }

но при подсчете длины с использованием "long length = clob.length()" выдается следующее исключение

java.sql.SQLException: Must be logged on to server

at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:1160)
at oracle.jdbc.ttc7.TTC7Protocol.assertLoggedIn(TTC7Protocol.java:2196)
at oracle.jdbc.ttc7.TTC7Protocol.lobLength(TTC7Protocol.java:2698)
at oracle.sql.LobDBAccessImpl.length(LobDBAccessImpl.java:468)
at oracle.sql.CLOB.length(CLOB.java:214)
at org.hibernate.lob.SerializableClob.length(SerializableClob.java:33)
at com.starcj.cmt.application.dao.ApplicationDaoImpl.convertClobToString(ApplicationDaoImpl.java:110)
at com.starcj.cmt.termsandcondmgmt.dao.TermsAndCondDaoImpl.getAllActiveTermsandcond(TermsAndCondDaoImpl.java:91)
at com.starcj.cmt.termsandcondmgmt.service.TermsAndCondServiceImpl.getAllActiveTermsAndCond(TermsAndCondServiceImpl.java:43)
at com.starcj.cmt.termsandcondmgmt.controller.TermsAndCondListingCMTController.handleRequest(TermsAndCondListingCMTController.java:66)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
at java.lang.Thread.run(Unknown Source)

За исключением того, что необходимо войти на сервер

но я получаю объект clob из базы данных


person Vipul    schedule 17.02.2010    source источник
comment
Страдаю такой же проблемой. До сих пор не понимаю, как это происходит. Подскажите, пожалуйста, как вы это исправили?   -  person hardPass    schedule 01.04.2014


Ответы (2)


В вашем объекте гибернации (который мы не видим) объявите свойство типа String и аннотируйте его с помощью @Lob (опять же, я не знаю, используете ли вы аннотации или XML), и он будет работать без необходимости любое ручное преобразование.

Это происходит потому, что в то время, когда вы пытаетесь проанализировать сущность, сеанс и базовое соединение закрыты, поэтому вы не можете передать значение CLOB из базы данных.

Альтернативой приведенному выше решению может быть использование фильтра OpenSessionInView. Это позволит вам открыть сеанс (и базовое соединение с базой данных) во время рендеринга представления (т.е. вашего jsps)

person Bozho    schedule 17.02.2010

Откуда вы берете CLOB? Соединение, которое его создало, все еще открыто? Сообщение об ошибке, по-видимому, указывает на то, что соединение с базой данных было закрыто. Если вы используете Hibernate, сеанс Hibernate все еще открыт?

person Thilo    schedule 17.02.2010
comment
Можете ли вы правильно отредактировать трассировку стека и код? Это делается путем размещения четырех пробелов перед каждой строкой. - person malaverdiere; 17.02.2010
comment
Я использую oracle 9.0 и использую спящий режим, и соединение не закрыто, в то время как соединение все еще открыто - person Vipul; 17.02.2010
comment
соединение не закрыто. Вы можете это проверить? Может что-то вроде hibernateSession.createSQLQuery("select * from dual").executeUpdate() - person Thilo; 17.02.2010