Moxy忽略json中的无效字段

时间:2014-12-26 14:05:57

标签: 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());
}

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

  1. 我的域模型中没有invalidField。
  2. 日期格式无效。
  3. 但实际上我得到了带有空值的测试对象。我的模型是:

    public class Test {
        private String name;
        private Date date; 
        //getters and setters here  
    }
    

    我认为这不是一种有效的行为。我该如何解决这个问题?

    感谢您的帮助。

    解决方案:

    正如Blaise Doughan所说,需要扩展MOXy的MOXyJsonProvider并覆盖preReadFrom方法来设置自定义javax.xml.bind.ValidationEventHandler。但问题是泽西的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);
          }
      }
      

1 个答案:

答案 0 :(得分:2)

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);
}