java - Moxy 忽略 json 中的无效字段

标签 java json jersey moxy jersey-2.0

当我发送这个请求时:

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

我的休息服务:

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

我希望得到一个异常(exception),因为:

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

但实际上我得到了具有空值的测试对象。我的域模型是:

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。

例子:

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

  3. 在应用程序配置中添加此资源:

    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/

相关文章:

java - 扩展 javax.ws.rs.core.Application 的类不能转换为 Servlet

javascript - Node.js:使用 "@"-symbol 解析 json-ld/JSON

php - 以 twig json 形式显示结果

java - 将服务类与泛型绑定(bind)

java - Jersey 部署

java - 如何在 Web 服务 REST jersey 中执行向上转换?

java - 如何通过 Spring Social Facebook 发送请求

java - 为什么 ModelMapper 以合并方式映射集合?

java - 使用应用程序图标而不是默认文件夹图标创建文件夹

json - Unix命令行JSON解析器?