当我发送这个请求时:
{"invalidField": "value", "date": "value"}
我的休息服务:
@PUT
@Consumes("application/json")
public void putJson(Test content) {
System.out.println(content.toString());
}
我希望得到一个异常(exception),因为:
- 我的领域模型中没有 invalidField。
- 日期格式无效。
但实际上我得到了具有空值的测试对象。我的域模型是:
public class Test {
private String name;
private Date date;
//getters and setters here
}
我认为这不是一个有效的行为。我该如何解决?
感谢您的帮助。
解决方案:
正如Blaise Doughan所说,需要扩展MOXy的MOXyJsonProvider并覆盖preReadFrom方法来设置自定义javax.xml.bind.ValidationEventHandler。但问题是 Jersey 的 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); } }
最佳答案
MOXy 将报告有关无效属性值的信息,但默认情况下它不会失败。报告是针对 javax.xml.bind.ValidationEventHandler
的一个实例完成的.您可以覆盖 Unmarshaller
上设置的 ValidationEventHandler
来执行此操作。
您可以创建自己的 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);
}
关于java - Moxy 忽略 json 中的无效字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27658173/