当前位置: 首页 > 面试题库 >

Moxy忽略JSON中的无效字段

公冶高峯
2023-03-14
问题内容

当我发送此请求时:

{"invalidField": "value", "date": "value"}

我的休息服务:

@PUT
@Consumes("application/json")
public void putJson(Test content) {
    System.out.println(content.toString());
}

我期望得到一个例外,因为:

  1. 我的域模型中没有invalidField。
  2. 日期格式无效。

但是实际上我得到的测试对象具有空值。我的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。

例:

  1. 创建您自己的扩展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;
        }
    }
  1. 创建您自己的扩展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;
            }
        });
    }


}
  1. 在应用程序配置中添加以下资源:
        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。