【发布时间】:2015-02-23 19:51:30
【问题描述】:
当我发送这个请求时:
{"invalidField": "value", "date": "value"}
我的休息服务:
@PUT
@Consumes("application/json")
public void putJson(Test content) {
System.out.println(content.toString());
}
我希望得到一个异常,因为:
- 我的域模型中没有 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); } }
【问题讨论】:
-
感谢您的回复。我只是想从 Jackson 迁移到 Moxy,因为它现在是 Glassfish 的默认库。但是因为这种行为只要是不可能的。
-
不确定此解决方案,因为您的 ValidationEventHandler 将为每个错误返回 false,但这不是您想要的。您只希望在特定情况下为 false。
标签: java json jersey moxy jersey-2.0