当我发送此请求时:
{"invalidField": "value", "date": "value"}
到我的休息服务:
@PUT
@Consumes("application/json")
public void putJson(Test content) {
System.out.println(content.toString());
}
我希望得到一个例外,因为:
但实际上我得到了带有空值的测试对象。我的模型是:
public class Test {
private String name;
private Date date;
//getters and setters here
}
我认为这不是一种有效的行为。我该如何解决这个问题?
感谢您的帮助。
正如Blaise Doughan所说,需要扩展MOXy的MOXyJsonProvider并覆盖preReadFrom方法来设置自定义javax.xml.bind.ValidationEventHandler。但问题是泽西的ConfigurableMoxyJsonProvider将始终首先被选中,除非您编写的MessageBodyWriter / MessageBodyReader使用比Object更具体的类型进行参数化。要解决此问题,必须禁用MOXy,然后启用CustomMoxyJsonProvider。
示例:
创建自己的功能,扩展javax.ws.rs.core.Feature:
@Provider
public class CustomMoxyFeature implements Feature {
@Override
public boolean configure(final FeatureContext context) {
final String disableMoxy = CommonProperties.MOXY_JSON_FEATURE_DISABLE + '.' + context.getConfiguration().getRuntimeType().name().toLowerCase();
context.property(disableMoxy, true);
return true;
}
}
创建扩展MOXyJsonProvider的自己的提供程序:
@Provider
public class CustomMoxyJsonProvider extends MOXyJsonProvider {
@Override
protected void preReadFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, Unmarshaller unmarshaller) throws JAXBException {
unmarshaller.setEventHandler(new ValidationEventHandler() {
@Override
public boolean handleEvent(ValidationEvent event) {
return false;
}
});
}
}
在应用程序配置中添加此资源:
package com.vinichenkosa.moxyproblem;
import java.util.Set;
import javax.ws.rs.core.Application;
@javax.ws.rs.ApplicationPath("webresources")
public class ApplicationConfig extends Application {
@Override
public Set<Class<?>> getClasses() {
Set<Class<?>> resources = new java.util.HashSet<>();
addRestResourceClasses(resources);
return resources;
}
private void addRestResourceClasses(Set<Class<?>> resources) {
resources.add(com.vinichenkosa.moxyproblem.TestResource.class);
resources.add(com.vinichenkosa.moxyproblem.custom_provider.CustomMoxyFeature.class);
resources.add(com.vinichenkosa.moxyproblem.custom_provider.CustomMoxyJsonProvider.class);
}
}
答案 0 :(得分:2)
MOXy将报告有关无效属性值的信息,但默认情况下它们不会失败。报告是针对javax.xml.bind.ValidationEventHandler
的实例完成的。您可以覆盖ValidationEventHandler
上的Unmarshaller
设置来执行此操作。
您可以创建自己的MesageBodyReader
/ MessageBodyWriter
来扩展MOXy MOXyJsonProvider
并覆盖preReadFrom
方法来执行此操作。
@Override
protected void preReadFrom(Class<Object> type, Type genericType,
Annotation[] annotations, MediaType mediaType,
MultivaluedMap<String, String> httpHeaders,
Unmarshaller unmarshaller) throws JAXBException {
unmarshaller.setEventHandler(yourValidationEventHandler);
}