首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >javax.xml.bind.JAXBException:类java.util.ArrayList和它的任何超类都是已知的。

javax.xml.bind.JAXBException:类java.util.ArrayList和它的任何超类都是已知的。
EN

Stack Overflow用户
提问于 2021-02-24 18:07:24
回答 1查看 2.2K关注 0票数 1

我正在编写一个MVC Java程序,使用JAXB生成XML并发送到display。代码运行,XML在浏览器中正确显示,但我仍然在IDE控制台中获得一个JAXBException。

我已经提到了关于这里这里主题的几个页面。我按照建议添加了JAXB注释,但是错误并没有消失。

有人能帮忙吗?

Web

代码语言:javascript
运行
复制
@WebServlet(name = "GetAllFilms", value = "/GetAllFilms")
public class GetAllFilms extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setCharacterEncoding("UTF-8");
        String jspDisplayString = "";

        String dataFormat = request.getParameter("format");
        if (dataFormat == null) dataFormat = "json";

        FilmDAO filmDAO = new FilmDAO();
        ArrayList<Film> allFilms = filmDAO.getAllFilms();

        request.setAttribute("films", allFilms);

        String viewJspFilePath = "";

        if (dataFormat.equals("json")) {
            response.setContentType("application/json");
            viewJspFilePath = "/WEB-INF/results/films-json.jsp";

            jspDisplayString = jsonGenerator(allFilms);

        } else if (dataFormat.equals("xml")) {
            response.setContentType("text/xml");
            viewJspFilePath = "/WEB-INF/results/films-xml.jsp";

            try {
                jspDisplayString = xmlGenerator(allFilms);
            } catch (JAXBException e) {
                e.printStackTrace();
            }

        } else {
            response.setContentType("text/plain");
            viewJspFilePath = "/WEB-INF/results/films-string.jsp";

            jspDisplayString = stringGenerator(allFilms);
        }

        RequestDispatcher dispatcher =
                request.getRequestDispatcher(viewJspFilePath);
        dispatcher.include(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

    private String xmlGenerator(ArrayList<Film> allFilms)
            throws JAXBException, FileNotFoundException {

        FilmList filmList = new FilmList();
        filmList.setFilmList(allFilms);

        JAXBContext jaxbContext = JAXBContext.newInstance(FilmList.class);
        Marshaller marshaller = jaxbContext.createMarshaller();

        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        StringWriter stringWriter = new StringWriter();
        marshaller.marshal(allFilms, stringWriter);

        return stringWriter.toString();
    }
}

电影模型类(带有JAXB注释)

代码语言:javascript
运行
复制
package model_beans;

@XmlRootElement(name = "film")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(propOrder = { "id", "title", "year", "director", "stars", "review" })

public class Film {

    public Film() {

    }

    public Film(int id, String title, int year, String director, String stars,
                String review) {
        super();
        this.id = id;
        this.title = title;
        this.year = year;
        this.director = director;
        this.stars = stars;
        this.review = review;
    }

    int id;
    String title;
    int year;
    String director;
    String stars;
    String review;

    *getters / setters excluded for ease of reading*

    @Override
    public String toString() {
        return "Film [id=" + id + ", title=" + title + ", year=" + year
                + ", director=" + director + ", stars=" + stars + ", review="
                + review + "]";
    }
}

FilmList模型类(带有JAXB注释)

代码语言:javascript
运行
复制
package model_beans;

@XmlRootElement(namespace = "model_beans")
@XmlAccessorType(XmlAccessType.FIELD)
public class FilmList {

    @XmlElementWrapper(name = "filmList")
    @XmlElement(name = "film")
    private ArrayList<Film> filmList;

    public ArrayList<Film> getFilmList() {
        return filmList;
    }

    public void setFilmList(ArrayList<Film> filmList) {
        this.filmList = filmList;
    }
}

JSP数据格式

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>
<%--@elvariable id="films" type="model_beans.Film"--%>
<%@taglib prefix = "c" uri = "http://java.sun.com/jsp/jstl/core"%>
<films>
  <headings>
    <heading>Film ID</heading>
    <heading>Title</heading>
    <heading>Year</heading>
    <heading>Director</heading>
    <heading>Stars</heading>
    <heading>Review</heading>
  </headings>
  <c:forEach items="${films}" var="f">
    <film>
      <id>${f.id}</id>
      <title>${f.title}</title>
      <year>${f.year}</year>
      <director>${f.director}</director>
      <stars>${f.stars}</stars>
      <review>${f.review}</review>
    </film>
  </c:forEach>
</films>

堆栈跟踪

代码语言:javascript
运行
复制
javax.xml.bind.JAXBException: class java.util.ArrayList nor any of its super class is known to this context.
    at com.sun.xml.internal.bind.v2.runtime.JAXBContextImpl.getBeanInfo(JAXBContextImpl.java:567)
    at com.sun.xml.internal.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:467)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:308)
    at com.sun.xml.internal.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:236)
    at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:116)
    at controller_servlets.GetAllFilms.xmlGenerator(GetAllFilms.java:125)
    at controller_servlets.GetAllFilms.doGet(GetAllFilms.java:68)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:626)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:690)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374)
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:888)
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1597)
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:748)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-24 18:42:34

按以下方式修改FilmList类,

  1. @XmlRootElement注释添加到类中
  2. 从类中删除@XmlElementWrapper注释

FilmList.java

代码语言:javascript
运行
复制
    @XmlRootElement(name="filmList")
    public class FilmList {

        private ArrayList<Film> listFilm;

        @XmlElement(name = "film")
        public ArrayList<Film> getFilmList() {
            return listFilm;
        }

        public void setFilmList(ArrayList<Film> listFilm) {
            this.listFilm = listFilm;
        }
    }

Film.java

代码语言:javascript
运行
复制
@XmlRootElement(name = "film")
@XmlType(propOrder = { "id", "title", "year", "director", "stars", "review" })
public class Film {

    public Film() {

    }

    public Film(int id, String title, int year, String director, String stars,
                String review) {
        super();
        this.id = id;
        this.title = title;
        this.year = year;
        this.director = director;
        this.stars = stars;
        this.review = review;
    }

    int id;
    String title;
    int year;
    String director;
    String stars;
    String review;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getDirector() {
        return director;
    }

    public void setDirector(String director) {
        this.director = director;
    }

    public String getStars() {
        return stars;
    }

    public void setStars(String stars) {
        this.stars = stars;
    }

    public String getReview() {
        return review;
    }

    public void setReview(String review) {
        this.review = review;
    }

    @Override
    public String toString() {
        return "Film [id=" + id + ", title=" + title + ", year=" + year
                + ", director=" + director + ", stars=" + stars + ", review="
                + review + "]";
    }
}

Marshaller.java

代码语言:javascript
运行
复制
public class Marshaller {

    public static void main(String[] args) {
    
        ArrayList<Film> listFilm = new ArrayList<>();
        StringWriter stringWriter = new StringWriter();
        FilmList filmList = new FilmList();

        Film film = new Film();
        film.setDirector("a");
        film.setId(1);
        film.setReview("b");
        film.setStars("c");
        film.setTitle("e");
        film.setYear(2020);
        listFilm.add(film);
        filmList.setFilmList(listFilm);
    
        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(FilmList.class);
            javax.xml.bind.Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(filmList, stringWriter);
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        System.out.println(stringWriter);
    }
}

输出

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<filmList>
    <film>
        <id>1</id>
        <title>e</title>
        <year>2020</year>
        <director>a</director>
        <stars>c</stars>
        <review>b</review>
    </film>
</filmList>

编辑过的

以下错误的原因是@XmlRootElementArrayList<Film>都使用了相同的名称(ArrayList<Film>)。因此,请将ArrayList<Film>的名称更改为listFilm

请注意。请将@XmlElement注释设置为get方法

最后编辑

在上面的servlet中,您尝试在(allFilms)方法中封送java集合( Film列表)。

代码语言:javascript
运行
复制
marshaller.marshal(allFilms, stringWriter);

但是不能封送集合和java集合类没有JAXB注释。

在您的示例中,创建了FilmList对象,但它不用于封送。我认为这是你的错误。请按以下方式封送filmList

代码语言:javascript
运行
复制
marshaller.marshal(filmList, stringWriter);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66356475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档