2010-04-03 3 views
0

내 웹 응용 프로그램 컨트롤러에서 유형이 java.sql.SQLXML 인 db에서 결과를 얻고 있습니다. 축약 형으로 반환 될보기로 전달하려고합니다 (XML로).Spring MVC에서 SQLXML 타입을 전달하는 방법은 무엇입니까?

문제는 SQLXML과 관련된 데이터가 JdbcTemplate 호출을 떠나 자마자 릴리스된다는 것입니다. 그러면 모델을 사용하여 데이터를 뷰에 전달해야합니까?

답변

0

가장 간단한 해결책은 당신이 JdbcTemplate 호출을 떠나기 전에 SQLXML 객체에서 데이터를 읽을 및 byte[], String, DOM 또는 무엇이든으로 데이터를 반환하는 것입니다.

실용적이지 않은 경우 (예 : 데이터가 너무 큰 경우) JdbcTemplate 통화 범위를 벗어난 연결을 유지하기위한 조치를 취해야하며 이는 트랜잭션 사용을 의미합니다. JdbcTemplate을 호출하기 전에 트랜잭션을 열면 연결이 해당 트랜잭션에 바인딩되고 트랜잭션을 닫을 때까지 연결이 유지됩니다. 불행히도 뷰를 렌더링하기에 충분히 길게 유지하면 체조가 필요합니다.

트랜잭션이 이미 설정되어 있지 않은 것으로 가정하면 컨텍스트에 DataSourceTransactionManager bean이 필요합니다. 그런 다음 트랜잭션을 관리하기 위해 HandlerInterceptor을 작성하여 뷰를 렌더링 할 수있을만큼 충분히 길게 유지하십시오. 봄 편리 인터셉터를 제공하지 않습니다이 아웃 - 오브 - 박스,이 같은 자신의 HandlerInterceptor, 뭔가 작성해야 그래서 등 JPA/최대 절전 모드 /로하는 것처럼 :

public class TransactionInterceptor extends HandlerInterceptorAdapter { 

    private PlatformTransactionManager txManager; 

    public void setTxManager(PlatformTransactionManager txManager) { 
     this.txManager = txManager; 
    } 

    @Override 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
     TransactionStatus tx = txManager.getTransaction(new DefaultTransactionDefinition()); 
     request.setAttribute("tx", tx); 
     return true; 
    } 

    @Override 
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 
     TransactionStatus tx = (TransactionStatus) request.getAttribute("tx"); 
     txManager.commit(tx); 
    } 
} 

을 당신 요청이 컨트롤러 + 뷰를 호출 할 때 configure this interceptor이 호출됩니다.

관련 문제