java - 从模式为 JAXB 绑定类生成 Jackson 属性
问题描述
在处理应用程序时,我也想将我的 JAXB 类用于 JSON 绑定。
所以对于某些类,我需要用@JsonTypeInfo
.
所以我想我会使用自定义绑定。
这是我的 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 Incompatibility error
[ERROR] Failed to execute goal org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.13.2:generate (default) on project Domain: Execution default of goal org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.13.2:generate failed: An API incompatibility was encountered while executing org.jvnet.jaxb2.maven2:maven-jaxb2-plugin:0.13.2:generate: java.lang.NoSuchMethodError: japa/parser/JavaParser.parse(Ljava/io/Reader;Z)Ljapa/parser/ast/CompilationUnit; (loaded from file:/C:/JavaDev/.m2/repository/com/google/code/javaparser/javaparser/1.0.8/javaparser-1.0.8.jar by java.net.URLClassLoader@ce3ebdfb) called from class org.jvnet.annox.japa.parser.AnnotationExprParser (loaded from file:/C:/JavaDev/.m2/repository/org/jvnet/annox/annox/1.0.2/annox-1.0.2.jar by java.net.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。
推荐阅读
- python - 什么缺少这个正则表达式来匹配 apache 日志的行?
- oracle - ORA-01031: 运行脚本时权限不足 (oracle 19c)
- docker - Docker-Compose - 将应用程序从 Bitbucket 推送到 ECR
- html - 如何在 Ember 的选定字段中显示网站上的路线内容
- python - Python 模块 mysql-connector 没有看到新的变化
- csv - 是否可以使用列填充查看 csv 和 tsv 文件以使列很好地对齐?
- c# - 如何更新我的数据库而不必在每次将数据保存到它时擦除它
- ios - Flutter 提交到 iOS
- algorithm - 使用最大堆与平衡 BST 实现优先级队列
- sql - 修改导致 postgresql 函数监视表上的修改