当我发送此请求时:
{"invalidField": "value", "date": "value"}
我的休息服务:
@PUT
@Consumes("application/json")
public void putJson(Test content) {
System.out.println(content.toString());
}
我期望得到一个例外,因为:
但是实际上我得到的测试对象具有空值。我的dmain模型是:
public class Test {
private String name;
private Date date;
//getters and setters here
}
我认为这不是有效的行为。我该如何解决?
感谢帮助。
正如Blaise
Doughan所说,需要扩展MOXy的MOXyJsonProvider并重写preReadFrom方法以设置自定义javax.xml.bind.ValidationEventHandler。但是问题在于,除非您编写的MessageBodyWriter
/
MessageBodyReader参数化类型比对象类型更具体,否则将始终首先选择Jersey的ConfigurableMoxyJsonProvider。若要解决此问题,必须禁用MOXy,然后启用CustomMoxyJsonProvider。
例:
@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;
}
}
@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
。您可以覆盖上的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);
}
问题内容: 我正在开发一个使用Spring-boot,关系数据库和Elasticsearch的应用程序。 我在代码的2个不同位置使用JSON序列化: 在REST API的响应中。 当代码与Elasticsearch交互时。 我在Elasticsearch中需要一些属性,但我想向应用程序用户隐藏(例如,来自关系数据库的内部ID)。 这是一个实体的例子: 问题 :当对象持久化在Elasticsearc
我使用Spring框架从GET请求接收JSON。所有的工作都很好,直到在DB中输入了一个错误的值,发生了以下情况: 02-25 14:46:04.035:E/AndroidRuntime(12271):org.springframework.http.converter.httpmessagenotreadableException:无法读取JSON:无法从字符串值“-3600”构造java.ut
问题内容: 我有一些必须序列化为JSON的数据。我正在使用JSON.NET。我的代码结构与此类似: 问题是,我的JSON输出需要具有ON OR 或ON- 取决于所使用的字段(即不为null)。默认情况下,我的JSON如下所示: 我知道我可以使用,但这给了我如下所示的JSON: 我需要的是: 有没有简单的方法可以做到这一点? 问题答案: 是的,您需要使用。 但是由于结构是值类型,因此您需要将Fiel
我希望在可以检索到它时忽略一个字段: 任何帮助都将不胜感激!
知道我做错了什么吗?如果重要的话,我将使用Jackson-core 2.1.1。