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).