Java Spring Boot为不同视图定制ViewResolver。查看json、xml、pdf和xls的呈现
我有两种观点(用户、事故)。构建能为用户正常工作的应用程序。在我需要修改的地方,它适用于许多视图 对于Json,我得到了两个视图的结果 它的作用是: localhost:9001/user_data.xml localhost:9001/user_data.json 本地主机:9001/user\u data.pdf 本地主机:9001/user_data.xls 本地主机:9001/contract_data.json 我想为以下对象渲染数据: 本地主机:9001/contract_data.xml 本地主机:9001/contract\u data.pdf 本地主机:9001/contract_data.xls 当我将pdf、xls和xml的代码分别放入由AbstractView扩展的相应视图中时 我需要更新代码,有人能指导我吗?在这里,我收集视图名称并修改响应 对于XML,我像这样编码: 公共抽象类AbstractXmlView扩展了AbstractView{Java Spring Boot为不同视图定制ViewResolver。查看json、xml、pdf和xls的呈现,java,xml,spring,spring-boot,xml-parsing,Java,Xml,Spring,Spring Boot,Xml Parsing,我有两种观点(用户、事故)。构建能为用户正常工作的应用程序。在我需要修改的地方,它适用于许多视图 对于Json,我得到了两个视图的结果 它的作用是: localhost:9001/user_data.xml localhost:9001/user_data.json 本地主机:9001/user\u data.pdf 本地主机:9001/user_data.xls 本地主机:9001/contract_data.json 我想为以下对象渲染数据: 本地主机:9001/contract_data.
public AbstractXmlView() {
setContentType("application/xml");
}
@Override
protected boolean generatesDownloadContent() {
return true;
}
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,HttpServletResponse response) throws Exception {
response.setContentType(getContentType());
buildXmlDocument(model, request, response);
System.out.println(response);
}
public abstract void buildXmlDocument(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response);
public AbstractXmlView(){
setContentType(“应用程序/xml”);
}
@凌驾
受保护的布尔生成下载内容(){
返回true;
}
@凌驾
受保护的void RenderMergeDoutpModel(映射模型、HttpServletRequest请求、HttpServletResponse响应)引发异常{
setContentType(getContentType());
buildXmlDocument(模型、请求、响应);
System.out.println(响应);
}
公共抽象void buildXmlDocument(映射模型、HttpServletRequest请求、HttpServletResponse响应);
}
@组成部分
公共类XmlView扩展了AbstractXmlView{
@SuppressWarnings("unchecked")
@Override
public void buildXmlDocument(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
response.setContentType("application/xml");
response.setCharacterEncoding("UTF-8");
JAXBContext jaxbContext = null;
Marshaller jaxbMarshaller = null;
try {
jaxbContext = JAXBContext.newInstance(Users.class);
jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Users users=new Users();
users.setUser( (List<User>) model.get("users"));
System.out.println("Users Object: "+users.getUser());
jaxbMarshaller.marshal(users, response.getWriter());
} catch (Exception e) {
e.printStackTrace();
}
//jaxbMarshaller.marshal(Users, System.out);
}
@SuppressWarnings(“未选中”)
@凌驾
public void buildXmlDocument(映射模型、HttpServletRequest请求、HttpServletResponse响应){
//TODO自动生成的方法存根
setContentType(“应用程序/xml”);
响应。setCharacterEncoding(“UTF-8”);
JAXBContext JAXBContext=null;
Marshaller jaxbMarshaller=null;
试一试{
jaxbContext=jaxbContext.newInstance(Users.class);
jaxbMarshaller=jaxbContext.createMarshaller();
setProperty(Marshaller.JAXB_格式化的_输出,true);
用户=新用户();
users.setUser((列表)model.get(“用户”);
System.out.println(“用户对象:+Users.getUser());
jaxbMarshaller.marshall(用户,response.getWriter());
}捕获(例外e){
e、 printStackTrace();
}
//jaxbMarshaller.marshall(用户,System.out);
}
}
添加到解析器中:
@Bean
public ViewResolver xmlViewResolver() {
return new XmlViewResolver();
}
@Bean
public ViewResolver contentNegotiatingViewResolver(ContentNegotiationManager manager) {
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
resolver.setContentNegotiationManager(manager);
// Define all possible view resolvers
List<ViewResolver> resolvers = new ArrayList<>();
resolvers.add(xmlViewResolver());
resolvers.add(csvViewResolver());
resolvers.add(excelViewResolver());
resolvers.add(pdfViewResolver());
resolvers.add(jsonViewResolver());
resolver.setViewResolvers(resolvers);
return resolver;
}
@Bean
公共ViewResolver xmlViewResolver(){
返回新的XmlViewResolver();
}
@豆子
公共视图解析程序contentnegotingviewresolver(ContentNegotiationManager){
ContentNegotingViewResolver解析器=新建ContentNegotingViewResolver();
解析程序.setContentNegotiationManager(管理器);
//定义所有可能的视图解析器
列表解析程序=新的ArrayList();
add(xmlviewsolver());
add(csvViewResolver());
add(excelviewsolver());
add(pdfViewResolver());
add(jsonviewsolver());
分解器。SetViewResolver(分解器);
返回解析器;
}
找到解决方案了吗?没有,我还没有找到解决方案。我被迫在控制器级别处理它,比如:MS Word文档的@GetMapping(path=“/viewVoteProtocol”,products=“application/vnd.openxmlformats of cedocument.wordprocessingml.document”);我认为您应该根据contorller方法尝试相应的MIME类型,从而覆盖每个解析器值。