JAXB.Пример рабочего кода, идентичного сломанному коду.(ссылка на src в github) - PullRequest
0 голосов
/ 25 ноября 2018

https://github.com/akgithubtest/WhyIsItBroken

Я не могу понять, почему один экземпляр использования JAXB выдает ошибку class Common.Broken nor any of its super class is known to this context. и почему другой работает отлично.Я разбил каждый из них на визуальную разницу и даже не могу различить разницу.Что мне здесь не хватает?

в Main.java, у меня есть.Это простой http-сервер, который прослушивает два маршрута: working и broken.broken не работает.working делает.

import Common.Broken;
import Common.Working;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.net.InetSocketAddress;

public class Main {
    public static void main(String[] args) throws Exception {
        int port = 8888;
        HttpServer httpServer = HttpServer.create(new InetSocketAddress(port), 0);
        httpServer.createContext("/broken", new BrokenHandler());
        httpServer.createContext("/working", new WorkingHandler());
        httpServer.setExecutor(null);
        httpServer.start();
    }

    static class BrokenHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange httpExchange)
                throws IOException
        {
            try {
                Broken broken = new Broken();
                broken.age = 100;
                broken.id = 3;
                broken.name = "This doesn't work. Why?";

                ResponseHandler responseHandler = new ResponseHandler(broken);
                responseHandler.RespondBroken(httpExchange);
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            }
        }
    }

    static class WorkingHandler implements HttpHandler {
        @Override
        public void handle(HttpExchange httpExchange)
                throws IOException
        {
            try {

                Working working = new Working();
                working.age = 100;
                working.id = 3;
                working.name = "This works";

                ResponseHandler responseHandler = new ResponseHandler(working);
                responseHandler.RespondWorking(httpExchange);
            } catch (Exception ex) {
                System.out.println(ex.getMessage());
            }
        }
    }
}

В Common/Broken.java у меня есть следующее (что идентично Common/Working.java, но имя класса и файл называются Broken.

package Common;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement (name = "broken")
public class Broken {

    @XmlElement public String name;
    @XmlElement public int age;
    @XmlAttribute public int id;

}

Просто ради этого (на случай, если я что-то пропустил, вот Common/Working.java:

package Common;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlRootElement (name = "working")
public class Working {

    @XmlElement public String name;
    @XmlElement public int age;
    @XmlAttribute public int id;

}

Наконец, у меня есть обработчик ответа. Две функции почти идентичны.

import Common.Working;
import Common.Broken;
import com.sun.net.httpserver.HttpExchange;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.IOException;
import java.io.StringWriter;
import java.io.OutputStream;

public class ResponseHandler {

    public Broken broken;
    public Working working;

    private JAXBContext jaxbContext;
    private Marshaller marshaller;


    public ResponseHandler(Working working)
            throws JAXBException
    {
        this.working = working;
        this.Init();
    }

    public ResponseHandler(Broken broken)
            throws JAXBException
    {
        this.broken = broken;
        this.Init();
    }


    private void Init()
        throws JAXBException {
        this.jaxbContext = JAXBContext.newInstance(Working.class);
        this.marshaller = jaxbContext.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty("com.sun.xml.bind.xmlDeclaration", Boolean.FALSE);
    }

    public void RespondWorking(HttpExchange httpExchange)
            throws JAXBException, IOException
    {
        java.io.StringWriter output = new StringWriter();
        this.marshaller.marshal(this.working, output);
        String response = output.toString();
        httpExchange.sendResponseHeaders(200, response.length());
        OutputStream outputStream = httpExchange.getResponseBody();
        outputStream.write(response.getBytes());
        outputStream.close();
    }

    public void RespondBroken(HttpExchange httpExchange)
            throws JAXBException, IOException
    {
        java.io.StringWriter output = new StringWriter();
        this.marshaller.marshal(this.broken, output);
        String response = output.toString();
        httpExchange.sendResponseHeaders(200, response.length());
        OutputStream outputStream = httpExchange.getResponseBody();
        outputStream.write(response.getBytes());
        outputStream.close();
    }
}

Я не могу определить, что мне здесь не хватает. Я схожу с ума? (Src в ссылке на github).

1 Ответ

0 голосов
/ 25 ноября 2018

Это связано с тем, что вы вызываете метод Init() как для конструктора, который принимает Working, так и для конструктора, который принимает Broken.

Внутри метода Init()Вы звоните JAXBContext.newInstance(Working.class);.Когда метод Init() вызывается через конструктор с Broken, вызывается должно быть JAXBContext.newInstance(Broken.class);, а это не так, и поэтому он выдает эту ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...