Джерси-json имеет реализацию JAXB. Причина, по которой вы получаете это исключение, заключается в том, что у вас нет зарегистрированного поставщика или, более конкретно, MessageBodyWriter . Вам необходимо зарегистрировать правильный контекст в вашем провайдере:
@Provider
public class JAXBContextResolver implements ContextResolver<JAXBContext> {
private final static String ENTITY_PACKAGE = "package.goes.here";
private final static JAXBContext context;
static {
try {
context = new JAXBContextAdapter(new JSONJAXBContext(JSONConfiguration.mapped().rootUnwrapping(false).build(), ENTITY_PACKAGE));
} catch (final JAXBException ex) {
throw new IllegalStateException("Could not resolve JAXBContext.", ex);
}
}
public JAXBContext getContext(final Class<?> type) {
try {
if (type.getPackage().getName().contains(ENTITY_PACKAGE)) {
return context;
}
} catch (final Exception ex) {
// trap, just return null
}
return null;
}
public static final class JAXBContextAdapter extends JAXBContext {
private final JAXBContext context;
public JAXBContextAdapter(final JAXBContext context) {
this.context = context;
}
@Override
public Marshaller createMarshaller() {
Marshaller marshaller = null;
try {
marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
} catch (final PropertyException pe) {
return marshaller;
} catch (final JAXBException jbe) {
return null;
}
return marshaller;
}
@Override
public Unmarshaller createUnmarshaller() throws JAXBException {
final Unmarshaller unmarshaller = context.createUnmarshaller();
unmarshaller.setEventHandler(new DefaultValidationEventHandler());
return unmarshaller;
}
@Override
public Validator createValidator() throws JAXBException {
return context.createValidator();
}
}
}
Это ищет @XmlRegistry
в предоставленном имени пакета, который является пакетом, который содержит @XmlRootElement
аннотированных POJO.
@XmlRootElement
public class Person {
private String firstName;
//getters and setters, etc.
}
затем создайте ObjectFactory в том же пакете:
@XmlRegistry
public class ObjectFactory {
public Person createNewPerson() {
return new Person();
}
}
Зарегистрировав @Provider
, Джерси должен упростить для вас сортировку на вашем ресурсе:
@GET
@Consumes(MediaType.APPLICATION_JSON)
public Response doWork(Person person) {
// do work
return Response.ok().build();
}