What does JAXB need a public no-arg constructor for, during marshalling?
Marshaller msh = ctx.createMarshaller(); msh.marshal(object, System.out);
As others have noted, it shouldn't really need one but (at least in Sun's implementation) it does. You can get around this with a dummy constructor:
private MyObject() { throw new UnsupportedOperationException("No-arg constructor is just to keep JAXB from complaining"); }