我尝试根据这个教程创建pdf视图
我有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);
}
}当然,我在web.xml中做了适当的web.xml
问题:
Controller到PDF view的链接404 error code,当我删除headers = "Accept=application/pdf"时,我看到它试图用FreeMarkerViewResolver来解决它发布于 2016-07-17 18:01:37
Accept头应该由客户端(即浏览器)指定。@RequestMapping注释应该指定相应的produces属性来匹配请求。基本上,注释应该如下所示,以便将请求与Accept=application/pdf匹配
@RequestMapping(value = "/user_pdf", method = RequestMethod.GET, produces = "application/pdf")要测试该方法,请使用类似于邮递员指定Accept头的内容。
为了解决您的pdf视图,您需要配置一个视图解析器。在本教程中,它是这个部分(在您的片段中缺失):
<bean class="org.springframework.web.servlet.view.XmlViewResolver">
<property name="location">
<value>/WEB-INF/spring-pdf-views.xml</value>
</property>
</bean>此bean声明您有一个/WEB-INF/spring-pdf-views.xml文件,其中包含负责视图的bean的配置。但是,您可以配置BeanNameViewResolver以避免创建额外的文件(不太灵活的解决方案,但选择是您的):
<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>注意,在控制器方法中返回与视图-bean id完全相同的视图名(现在它们不一致)。因为
<bean id="PdfRevenueSummary" class="ua.epam.spring.hometask.view.UserPdfView"/>你应该回来
return new ModelAndView("PdfRevenueSummary", "listBooks", userDao.getAll());示例中的另一个问题是,UserPdfView类的bean可能会被实例化两次:它是在xml中声明的,并且可能由于@Component注释而被组件扫描所获取。
https://stackoverflow.com/questions/38423856
复制相似问题