gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:22:09 25 4
gpt4 key购买 nike

当我发送这个请求时:

{"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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com