2016-07-17 4 views
1

Я пытаюсь создать представление в формате PDF по этой tutorialSpring MVC: Понимание точки зрения связывания

У меня есть controller:

@Controller 
public class UserController { 

    @Autowired 
    UserDao userDao; 

    @RequestMapping(value = "/user_pdf", method = RequestMethod.GET, headers = "Accept=application/pdf") 
    public ModelAndView usersPdf(@ModelAttribute("model") ModelMap model) { 
     return new ModelAndView("pdfView", "listBooks", userDao.getAll()); 
    } 
} 

У меня есть servlet configuration:

<context:component-scan base-package="ua.epam.spring.hometask" /> 
<context:annotation-config/> 

<bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> 
    <property name="cache" value="true"/> 
    <!--<property name="prefix" value="/WEB-INF/ftl"/>--> 
    <property name="suffix" value=".ftl"/> 
</bean> 

<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <property name="templateLoaderPath" value="/WEB-INF/ftl/"/> 
</bean> 

<bean id="PdfRevenueSummary" 
     class="ua.epam.spring.hometask.view.UserPdfView"> 
</bean> 

И У меня есть pdf builder:

@Component 
public class UserPdfView extends AbstractPdfView { 

    protected void buildPdfDocument(Map model, 
            Document document, PdfWriter writer, HttpServletRequest req, 
            HttpServletResponse resp) throws Exception { 

     User user = (User) model.get("command"); 

     Paragraph header = new Paragraph(new Chunk("Generate Pdf USing Spring Mvc",FontFactory.getFont(FontFactory.HELVETICA, 30))); 
     Paragraph by = new Paragraph(new Chunk("Author " + user.getFirstName() + " " + user.getLastName(),FontFactory.getFont(FontFactory.HELVETICA, 20))); 

     document.add(header); 
     document.add(by); 

    } 

} 

Конечно, я сделал соответствующий <servlet-mapping> в web.xml

Вопросы:

  1. Как обязательные работы? Из учебника я вижу, что теперь есть связь от Controller до PDF view

  2. Пожалуйста, помогите мне узнать, как исправить мой код. Я вижу 404 error code сейчас, и когда я удалить headers = "Accept=application/pdf" я вижу, что пытается решить ее с FreeMarkerViewResolver

+0

'ModelAndView' вставляет объект модели в представление шаблона, поэтому разрешает доступ к шаблону для привязки к данным модели. Что вы не понимаете по этому поводу? –

+0

У меня также есть 'FreeMarkerViewResolver'. Я не понимаю, как 'Spring' решает, какой' viewresolver' выбрать –

+0

Все, что заканчивается расширением FTL, переходит в первый viewResolver, что соответствует совпадениям в конфигурации сервлета –

ответ

1

Accept заголовок должен быть указан клиентом (т.е. браузера). @RequestMapping аннотация должна указывать соответствующий атрибут produces для соответствия запросу. В основном, аннотации должны выглядеть так, чтобы соответствовать запрос с Accept=application/pdf

@RequestMapping(value = "/user_pdf", method = RequestMethod.GET, produces = "application/pdf") 

Чтобы проверить, что использование метода что-то вроде postman с указанием Accept заголовка.

Для того чтобы получить разрешенное PDF-представление, вы хотите настроить разрешающую способность представления. В учебнике именно эта часть (не хватает в ваших сниппетов):

<bean class="org.springframework.web.servlet.view.XmlViewResolver"> 
    <property name="location"> 
     <value>/WEB-INF/spring-pdf-views.xml</value> 
    </property> 
</bean> 

Этот компонент заявляет, что у вас есть /WEB-INF/spring-pdf-views.xml файл, содержащий конфигурацию для фасолью, ответственных за мнения. Однако вы можете настроить BeanNameViewResolver, чтобы избежать создания дополнительного файла (менее гибкое решение, но выбор вашего):

<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/> 

Позаботьтесь, чтобы вернуться точно такое же имя вида в методе контроллера, как вид-боба идентификатор (теперь они несовместимы) , Поскольку

<bean id="PdfRevenueSummary" class="ua.epam.spring.hometask.view.UserPdfView"/> 

вы должны вернуть

return new ModelAndView("PdfRevenueSummary", "listBooks", userDao.getAll()); 

Еще одна проблема с вашим примером является то, что, вероятно, боб UserPdfView класса получает экземпляр дважды: он объявлен в конфигурации XML и может быть подобран компонент сканирования из-за @Component аннотация.

+0

Спасибо за ответ! Это ясно. Но в любом случае я получаю исключение 'javax.servlet.ServletException: не удалось разрешить представление с именем« pdfView »в сервлет с именем« user_pdf » –

+0

И когда я прокомментирую все материалы, связанные с« FreeMakerView », он показывает мне код ошибки 404 и для почему-то перенаправляет меня на '/ pdfView' Что происходит? –

+0

Я добавил в ответ информацию о конфигурации view-resolver. –