当前位置: 首页 > 知识库问答 >
问题:

未调用JAXB解组器的handleEvent

容远
2023-03-14

我正在尝试使用MOXy for JAXB JSON支持来设置一个简单的Jersey JAX-RS应用程序,我想定制解组器。我做了以下工作:

@Provider
public class CustomProvider extends ConfigurableMoxyJsonProvider{
  @Override
  protected void preReadFrom(..., Unmarshaller unmarshaller) throws JAXBException{
    super.preReadFrom(...);
    System.out.println("preReadFrom entered");

    unmarshaller.setEventHandler(new ValidationEventHandler(){
      @Override
      public boolean handleEvent(ValidationEvent event){
        System.out.println("Entered handleEvent");

        return false;
      }
    });
  }
}

我为preReadFrom编写了一个覆盖,并在解组器上设置了一个事件处理程序。当我传递一个无效的JSON正文时,会执行preReadFrom中的print语句,但不会执行事件处理程序中的print语句。因此,提供程序已正确注册,但未调用事件处理程序。

什么可能导致此问题?

我想要实现的是,当用户在JSON正文中传递无关的属性时,我想要抛出一个错误(默认情况下,这些属性被忽略)。在各种网站上搜索时,添加事件处理程序是唯一的方法。如果我也能以不同的方式实现这一点,那就太好了。

共有1个答案

明正德
2023-03-14

>

  • 我假设System.out.println("preReadfrom输入");被调用,并且您的CustomProvider实际上被注册和使用。因为在Weblogic中,例如,即使您注册了不同的提供程序,仍然会调用默认的ConfigurableMoxyJsonProvider,除非您禁用Moxy。

    如果第一个假设是正确的,那么肯定会调用public boolean handleEvent(ValidationEvent事件)进行验证,就像您的Pojo属性是数值的,并且您正在json中传递字符串一样。

    对于unappedelements,我看到Moxy“忽略”了Json的警告。这意味着如果您的pojo如下所示:

    public class Emp {
        public Emp() {
            super();
        }
        private int id ;
        public void setId(int id) {
            this.id = id;
        }
    
        public int getId() {
            return id;
        }
    
    }
    

    你的Json就像:{“id”:11,“name1”:111}那么你的handleEvent就不会被调用。莫西使用组织的原因。日食坚持不懈内部的oxm。记录解压记录‌mpl。星光大道‌​在向事件处理程序发出警告之前,检查媒体类型是否为xml。

    那么如何解决这个问题呢。我可能不知道最好的答案,但以下是我的解决方案:

    在您的preReadfrom方法中添加您的自定义UnmappdHandlerClass,如下所示

    protected void preReadFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType,
                               MultivaluedMap<String, String> httpHeaders,
                               Unmarshaller unmarshaller) throws JAXBException {
        System.out.println("preReadFrom entered");
        super.preReadFrom(type, genericType, annotations, MediaType.WILDCARD_TYPE, httpHeaders, unmarshaller);
        System.out.println("preReadFrom returned from super");
    
        //new code
        if(unmarshaller instanceof org.eclipse.persistence.jaxb.JAXBUnmarshaller) {
            org.eclipse.persistence.jaxb.JAXBUnmarshaller   moxyUn = ( org.eclipse.persistence.jaxb.JAXBUnmarshaller)unmarshaller;
            moxyUn.getXMLUnmarshaller().setUnmappedContentHandlerClass(CustomUnmapped.class);
        }
    //your existing code
        unmarshaller.setEventHandler(new ValidationEventHandler() {
            @Override
            public boolean handleEvent(ValidationEvent event) {
                System.out.println("Entered handleEvent");
    
                return false;
            }
        });
    }
    

    你可以像这样使用Customunmap类:

    class CustomUnmapped extends org.eclipse.persistence.internal.oxm.unmapped.DefaultUnmappedContentHandler {
        @Override
        public void startElement(String p1, String p2, String p3, Attributes p4) throws SAXException {
            throw new SAXNotRecognizedException(p1);
        }
    }
    

    这将工作。但是在尝试3之前,请确保您的a)CustomProvider实际上是通过添加断点或System.out.. statement调用的。和b)您的handleEvent被调用用于一般错误,如在json中传递字符串x,用于数字字段。

  •  类似资料:
    • 我正在尝试使用 xsl 转换转换第三方 xml,然后使用 JAXB 将生成的 xml 转换为 java 对象。但是,在两者之间的一些标记为 CDATA 的元素内容会丢失。 下面是我的第三方xml示例 XSL转换 Java 类 翻译 但是上面的代码将inputXml输出为]] 任何建议都将不胜感激。

    • 问题内容: 我正在尝试创建一个非常简单的REST服务器。我只是有一个测试方法,它将返回字符串列表。这是代码: 它给出以下错误: 我希望JAXB对诸如String,Integer等简单类型具有默认设置。我想不是。这是我的想象: 使这种方法最简单的方法是什么? 问题答案: 我使用@LiorH的示例并将其扩展为: 注意,它使用泛型,因此您可以将其与String之外的其他类一起使用。现在,应用程序代码很简

    • 我有下面的JAXB注释类(用XJC生成) 当以下面的方式解组它时,一切都很好: 当按以下方式解组时,它将崩溃,出现异常 例外: 有人能解释这种奇怪的行为吗? 正在解组的XML文件粘贴在下面:

    • 我正在尝试使用JAXB从遗留系统中解压XML文档。我的xml结构如下所示:

    • 问题内容: 我有一个返回此XML的服务: 要么 我想使用以下类解组检索到的XML: 结果 : 项目名称 : 用户名 : 首先不起作用的解决方案 我得到一个空名单。 第二不起作用的解决方案 受本文启发,http://blog.bdoughan.com/2012/11/creating-generic-list-wrapper-in- jaxb.html 我修改了Response类: 然后使用以下代码

    • 我已经生成java类使用从一个xsd,其中根元素是类型的。 jaxb生成的根元素是 当我尝试解组与该xsd对应的xml并强制转换JaxbElement时,它会引发一个强制转换异常: 片段: