Spring MVC 3中的MarshallingView

当我使用MarshallingView编组FileManagement对象的列表(java.util.List)时,我收到此错误。 如果我只将一个对象添加到模型中,则不会发生这种情况。 所以它使用的是一个对象,而不是集合(List)。

例外

javax.servlet.ServletException: Model object [[com.afirme.filemanagement.domain.FileManagement@69c, com.afirme.filemanagement.domain.FileManagement@65f, com.afirme.filemanagement.domain.FileManagement@661, com.afirme.filemanagement.domain.FileManagement@69d, com.afirme.filemanagement.domain.FileManagement@662]] retrieved via key [fileManagements] is not supported by the Marshaller at org.springframework.web.servlet.view.xml.MarshallingView.locateToBeMarshalled(MarshallingView.java:129) at org.springframework.web.servlet.view.xml.MarshallingView.renderMergedOutputModel(MarshallingView.java:98) at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250) at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1120) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:890) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:792) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:851) at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:756) at javax.servlet.http.HttpServlet.service(HttpServlet.java:743) 

FileManagement.java

 @XmlRootElement public class FileManagement { private Long id; private String code; private String name; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

FileManagementService.java

 public interface FileManagementService { /** * Find all FileManagements. * @return */ public List findAll(); } 

FileManagementController.java

 @Controller public class FileManagementController { @RequestMapping(value="/filemanagements", method=RequestMethod.GET) public String list(Model model) { model.addAttribute("fileManagements", fileManagementService.findAll()); return LIST_VIEW; } private static final String LIST_VIEW = "/filemanagements/list" ; } 

servletContext.xml:

              

/WEB-INF/views.xml

        

我究竟做错了什么?

这与1603404的问题相同。 它不起作用,因为Spring的JAXB marshaller( Jaxb2Marshaller )希望类上的@XmlRootElement能够编组。 因此可以通过添加中间类来表示列表来解决:

 @XmlRootElement(name = "files") public class FileManagementList { @XmlElement(name = "file") private List files; public FileManagementList() { this(Collections.emptyList()); } public FileManagementList(List files) { this.files = files; } }