2012-02-29 15 views
10

Necesito obtener la salida representada de Spring 3.1 MVC View en una cadena (para enviar a un convertidor PDF, a un correo electrónico MIME, etc.) y he estado usando el siguiente código:Obtener la salida representada de Spring 3.1 MVC View

Esto se inyecta en el controlador

@Autowired 
    TilesViewResolver viewResolver; 

y el siguiente método de ayuda:

private String renderViewToString(ModelMap map, HttpServletRequest request, HttpServletResponse httpServletResponse, final String viewName) { 
     final StringWriter html = new StringWriter(); 
     View pdfView = new View() { 
      @Override 
      public String getContentType() { 
       return "application/pdf"; 
      } 

      @Override 
      public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { 

       HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(response) { 
        @Override 
        public PrintWriter getWriter() throws IOException { 
         return new PrintWriter(html); 
        } 
       }; 
       View realView = viewResolver.resolveViewName(viewName, Locale.US); 
       Map<String, Object> newModel = new HashMap<String, Object>(model); 
       newModel.put("pdfMode", Boolean.TRUE); 
       realView.render(newModel, request, wrapper); 
      } 
     }; 
     try { 
      pdfView.render(map, request, httpServletResponse); 
     } catch (Exception e) { 
      // Ignored for now 
     } 
     return html.toString(); 
    } 

crédito a Ted Young y su HTML2PDFViewResolver en el que se basa mi código.

Mi pregunta es la mejor forma de hacerlo? El código que tengo funciona bien, pero ahora me estoy acercando a Production y pensé que si había margen de mejora, me gustaría intentarlo.

Gracias a todos

+4

nop, se ve bien. –

+0

preguntas como una pregunta ... Lo vi como una respuesta ... exactamente lo que estaba buscando ... absolutamente útil para mí, ya que solo necesitaba el html para enviarlo como parte de mi respuesta json ... Pulgares arriba hombre ... ¡Rock! – CodeBurner

Respuesta

1

Se están rompiendo el patrón MVC por discotecas juntos la vista y el controlador. Una mejor solución es definir una vista y registrarla en ContentNegotiatingViewResolver. En función del tipo de contenido solicitado, el solucionador delegaría la solicitud en su vista.

p. Ej.

<bean 
    class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver"> 
     <property name="order" value="0" /> 
     <property name="mediaTypes"> 
      <map> 
       <entry key="pdf" value="application/pdf" /> 
      </map> 
     </property> 
     <property name="defaultViews"> 
      <list> 
       <bean class="com.abc.MyCustomView"> 
        <property name="contentType" value="pdf" /> 
       </bean> 
      </list> 
     </property> 
    </bean>