2012-12-03 27 views
0

我使用RestEasy的,节约使用Hibernate的斑点休眠+ RestEasy的+ Blobstream

我在视图中配置的公开会议

我休息,处理是非事务,我的服务,检索的java .sql.blobs是事务性的。

的问题:在JDBC连接由HibernateTransactionManager来关闭该服务检索BLOB之后:doCleanupAfterCompletion(Hibernate的Session未闭)

所以休息以后不能读取BLOB流,因为它只有在相同的jdbc连接仍然打开的情况下才有效

我如何能够在事务服务函数之后教会不关闭jdbc连接?

应该关闭会话时通过创建一个斑点封闭提供商

+0

为什么你认为你不能从另一个读取BLOB连接? –

+0

,因为当我尝试从它读取时,我得到异常“连接关闭” – wutzebaer

回答

0

我解决了这个问题,adopded从InputStream的提供商

@Provider 
@Produces("*/*") 
public class BlobProvider implements MessageBodyWriter<Blob> { 

    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return Blob.class.isAssignableFrom(type); 
    } 

    public long getSize(Blob blob, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { 
     return -1; 
    } 

    public void writeTo(Blob blob, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException { 
     SessionFactory sessionFactory = (SessionFactory) Utils.getBean("sessionFactory"); 
     sessionFactory.getCurrentSession().beginTransaction(); 
     InputStream inputStream = null; 
     try { 
      inputStream = blob.getBinaryStream(); 
      int c = inputStream.read(); 
      if (c == -1) { 
       httpHeaders.putSingle(HttpHeaderNames.CONTENT_LENGTH, Integer.toString(0)); 
       entityStream.write(new byte[0]); // fix RESTEASY-204 
       return; 
      } else 
       entityStream.write(c); 
      ProviderHelper.writeTo(inputStream, entityStream); 
     } catch (SQLException e) { 
      Utils.logError(e); 
     } finally { 
      if (inputStream != null) 
       inputStream.close(); 
     } 
     sessionFactory.getCurrentSession().getTransaction().commit(); 
    } 
}