java - 从模式生成 JAXB 绑定(bind)类的 Jackson 属性

标签 java annotations jaxb

在开发应用程序时,我也想使用 JAXB 类进行 JSON 绑定(bind)。

因此,对于某些类,我需要使用 @JsonTypeInfo 进行注释。

所以我想我应该使用自定义绑定(bind)。

这是我的 XJB 文件的样子:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<jaxb:bindings version="1.0" 
              xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
              xmlns:xs="http://www.w3.org/2001/XMLSchema" 
              xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc"
              xmlns:annox="http://annox.dev.java.net"
              jaxb:extensionBindingPrefixes="xjc">

   <jaxb:bindings schemaLocation="../schema/im/vehicle.xsd">
      <jaxb:bindings node="xs:complexType[@name='Vehicle']">
        <annox:annotate target="class">
          <annox:annotate annox:class="com.fasterxml.jackson.annotation.JsonTypeInfo(use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME, include = com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY, property = 'subVehicleType')"/>
        </annox:annotate>
      </jaxb:bindings>
   </jaxb:bindings>

</jaxb:bindings>

这就是我在类里面想要的:

@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY, property="subVehicleType")

但我不断收到以下错误:

org.jvnet.annox.parser.exception.AnnotationElementParseException: Could not parse the annotation element.
    at org.jvnet.jaxb2_commons.plugin.annotate.AnnotatePlugin.annotate(AnnotatePlugin.java:364)
    at org.jvnet.jaxb2_commons.plugin.annotate.AnnotatePlugin.annotateClassOutline(AnnotatePlugin.java:311)
    at org.jvnet.jaxb2_commons.plugin.annotate.AnnotatePlugin.processClassOutline(AnnotatePlugin.java:190)
    at org.jvnet.jaxb2_commons.plugin.annotate.AnnotatePlugin.run(AnnotatePlugin.java:152)
    at com.sun.tools.xjc.model.Model.generateCode(Model.java:294)
    at org.jvnet.mjiip.v_2_2.XJC22Mojo.generateCode(XJC22Mojo.java:61)
    at org.jvnet.mjiip.v_2_2.XJC22Mojo.doExecute(XJC22Mojo.java:36)
    at org.jvnet.mjiip.v_2_2.XJC22Mojo.doExecute(XJC22Mojo.java:22)
    at org.jvnet.jaxb2.maven2.RawXJC2Mojo.doExecute(RawXJC2Mojo.java:282)
    at org.jvnet.jaxb2.maven2.RawXJC2Mojo.execute(RawXJC2Mojo.java:147)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:132)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:116)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:120)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:355)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:216)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:160)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:90)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:55)
    at java.lang.reflect.Method.invoke(Method.java:508)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)

我做错了什么吗?

更新

我按照答案中提到的那样做了:它在我的 TEST 独立项目中工作,但是当我在我的主项目中执行相同操作时,我收到以下 API 不兼容错误

[错误] 无法在项目域上执行目标 org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.13.2:生成(默认):目标 org.jvnet.jaxb2.maven2 的执行默认值:maven-jaxb2-plugin:0.13.2:generate failed: 执行 org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.13.2:generate: java.lang.NoSuchMethodError: japa/parser 时遇到 API 不兼容/JavaParser.parse(Ljava/io/Reader;Z)Ljapa/parser/ast/CompilationUnit; (由 java.net.URLClassLoader@ce3ebdfb 从文件:/C:/JavaDev/.m2/repository/com/google/code/javaparser/javaparser/1.0.8/javaparser-1.0.8.jar 加载)从类 org 调用.jvnet.annox.japa.parser.AnnotationExprParser(由java.net从文件/C:/JavaDev/.m2/repository/org/jvnet/annox/annox/1.0.2/annox-1.0.2.jar加载。 URLClassLoader@ce3ebdfb)。

我不确定是哪个其他 api 导致了此冲突。但从上面的消息中确实很难理解。

最佳答案

免责声明:我是 jaxb2-annotate-plugin 的作者.

正确的语法是:

<annox:annotate target="class">
      @com.fasterxml.jackson.annotation.JsonTypeInfo(
          use = com.fasterxml.jackson.annotation.JsonTypeInfo.Id.NAME,
          include = com.fasterxml.jackson.annotation.JsonTypeInfo.As.PROPERTY,
          property = "subVehicleType")
</annox:annotate>

基本上与您在 Java 中使用 FQCN 编写的方式完全相同。

关于java - 从模式生成 JAXB 绑定(bind)类的 Jackson 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50130787/

相关文章:

java - for 循环缺少 return 语句

java - jOOQ - 使用 QueryPart 占位符解析纯 sql

java - JXLS 设置表名称

java - 如何在 Scala 2.8 注释中指定静态数组?

java - 当找不到 @XmlIDREF ref 时,Jaxb 不会抛出异常

Java Annotation and Processor 将方法标记为只能调用一次?

java - 无法从 Card 转换为 int

spring - 如何使用注解将值注入(inject) bean 构造函数

java - 多个 JaxB 编码配置文件

java - Hibernate 注释中的映射