我是 Maven 新手,我创建了一个 Maven 项目,其中只有模式。我的目的是将我的所有 XSD 保留在这个项目中,编译并创建 JAXB 生成的类的 jar。下面是我的POM
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ads</groupId>
<artifactId>adsSchema</artifactId>
<packaging>jar</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>adsSchema</name>
<pluginRepositories>
<pluginRepository>
<id>maven2-repository.dev.java.net</id>
<name>Java.net Repository for Maven</name>
<url>http://download.java.net/maven/2/</url>
<layout>default</layout>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
<plugin>
<!-- jaxb plugin -->
<groupId>org.jvnet.jaxb2.maven2</groupId>
<artifactId>maven-jaxb2-plugin</artifactId>
<executions>
<execution>
<id>adsSchema</id>
<goals>
<goal>generate</goal>
</goals>
<configuration>
<args>
<param>-npa</param>
</args>
<!-- the package for the generated java classes -->
<generatePackage>com.ads.beans</generatePackage>
<npa>true</npa>
<!-- include the following schemas only; by default all …Run Code Online (Sandbox Code Playgroud) 我还有一个更棘手的问题:
E.g. Person Class has: --String firstName --String lastName --Map stringMap
Person person = new Person ();
person.setFirstName("FirstName");
person.setLastName("LastName");
Map<String,String> stringMap = new HashMap<String,String>();
stringMap.put("IwantThisKeyInXml","IwantThisValueInXml");
stringMap.put("IDONTwantThisKeyInXml","IDONTwantThisValueInXml");
InputStream iStream1 = classLoader.getResourceAsStream("person-binding.xml");
List<Object> fileList = new ArrayList<Object>();
fileList.add(iStream1);
Map<String, Object> properties = new HashMap<String,Object>();
properties.put(JAXBContextProperties.OXM_METADATA_SOURCE, fileList);
JAXBContext ctx = JAXBContext.newInstance(new Class[] { GaDictionary.class, Person.class }, properties);
Marshaller marshaller = ctx.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
Writer output = new StringWriter();
marshaller.marshal(person, output);
System.out.println(output);
Run Code Online (Sandbox Code Playgroud)
person-binding.xml 如下
<?xml version="1.0"?>
<xml-bindings
xmlns="http://www.eclipse.org/eclipselink/xsds/persistence/oxm"
package-name="my.test.model" xml-mapping-metadata-complete="true">
<xml-schema
element-form-default="QUALIFIED"/>
<java-types>
<java-type …Run Code Online (Sandbox Code Playgroud) 我有一个 wsdl 导入一个模式,我试图解析 xjc 命名多个具有相同名称的嵌套 MyElementName 类 - 这不会编译我在下面创建了这个绑定文件,但它给出了错误:
parsing a schema...
compiling a schema...
Exception in thread "main" java.lang.IllegalArgumentException: Illegal class inheritance loop.
Outer class MyElementName1 may not subclass from inner class: MyElementName1
at com.sun.codemodel.internal.JDefinedClass._extends(JDefinedClass.java:257)
at com.sun.tools.internal.xjc.generator.bean.ImplStructureStrategy$1._extends(ImplStructureStrategy.java:104)
at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.<init>(BeanGenerator.java:197)
at com.sun.tools.internal.xjc.generator.bean.BeanGenerator.generate(BeanGenerator.java:151)
at com.sun.tools.internal.xjc.model.Model.generateCode(Model.java:275)
at com.sun.tools.internal.xjc.Driver.run(Driver.java:342)
at com.sun.tools.internal.xjc.Driver.run(Driver.java:184)
at com.sun.tools.internal.xjc.Driver._main(Driver.java:107)
at com.sun.tools.internal.xjc.Driver.access$000(Driver.java:64)
at com.sun.tools.internal.xjc.Driver$1.run(Driver.java:87)
Run Code Online (Sandbox Code Playgroud)
我删除了 MyElementName1 的第一个绑定,它工作正常,但只命名了 1 个类,我想更改这两个名称,如何更改绑定文件,以便它将两个旧的嵌套类正确命名为我在下面选择的两个唯一名称。我想这样做是因为我有其他映射,其中有 4 个同名的嵌套类,因此需要能够命名每个类来解决更多嵌套的问题区域
<jaxb:bindings
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
version="2.1">
<jaxb:bindings schemaLocation="MYWSDL.wsdl">
<jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:complexType//xsd:sequence/xsd:element[@name='BBB']//xsd:complexType/xsd:sequence//xsd:element[@name='MyElementName']">
<jaxb:class name="MyElementName1"/>
</jaxb:bindings>
<jaxb:bindings node="//xsd:element[@name='AAAA']//xsd:sequence/xsd:element[@name='BBB']//xsd:element[@name='MyElementName']//xsd:sequence/xsd:element[@name='CCC']//xsd:sequence/xsd:element[@name='MyElementName']/xsd:complexType">
<jaxb:class name="MyElementName2"/>
</jaxb:bindings>
</jaxb:bindings>
</jaxb:bindings>
Run Code Online (Sandbox Code Playgroud)
这是 …
我正在使用 JAX-WS 生成自上而下的 Web 服务。在 wsdl 中,我导入一个包含所有必要元素的 xsd。我需要在soap 请求中以大写形式显示所有xml 节点,因此我将xsd 中的元素名称保留为大写。但是,在从 wsdl 生成类时,我可以看到 getter 和 setter 方法也以大写形式命名,但变量却没有。例如,如果我使用“SOURCE”作为 xsd 中的元素,我将获得相应的 getter 方法作为“getSOURCE”,而不是常规约定“getSource”。我尝试通过从架构生成 jaxb 类并单独保留 xsd 来进行游戏,但我无法获得预期的命名约定。
以下是使用的架构的一部分
<xs:complexType name="Data">
<xs:sequence>
<xs:element name="SEQ" type="xs:int"/>
<xs:element name="INDEX" type="xs:string"/>
<xs:element name="VALUE" type="xs:string"/>
</xs:sequence>
Run Code Online (Sandbox Code Playgroud)
这会在 jaxb 绑定后生成以下代码 -
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Data", propOrder = {
"seq",
"index",
"value"
})
public class Data {
@XmlElement(name = "SEQ")
protected int seq;
@XmlElement(name = "INDEX", required = true)
protected String index;
@XmlElement(name = "VALUE", required = true)
protected …Run Code Online (Sandbox Code Playgroud) 对象对 Serialized 接口的实现是否与该对象序列化为 JSON 或 XML 的能力相关?Java 序列化使用的文本格式有名称吗?如果不是,我们是否应该使用“序列化”一词来描述将对象导出为 JSON 或 XML,以避免混淆?在 AO 中,这三种序列化方法的典型用途是什么?
我知道 JAXB 通常用于将 XML 转换为 Java,而不是相反,但我听说相反的情况也是可能的。
根据 Camel 文档,我创建了 JaxbDataFormat(文档中的示例代码使用了不存在的构造函数?)
@Override
public void configure() throws Exception {
JaxbDataFormat jaxbDataFormat = new JaxbDataFormat();
jaxbDataFormat.setContextPath("somepackage");
Run Code Online (Sandbox Code Playgroud)
我有 pom 依赖
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jaxb</artifactId>
<version>2.18.3</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
不起作用:“ConvertBody...因为无法创建数据格式'jaxb'。”
有人可以给出一个示例代码,说明 jaxb 转换应该如何与 Camel 一起使用。我有 Camel in Action 2ed,但那里的示例使用 XML-definde 路由。使用 XML 的过程似乎很简单 - 但我对使用 xml 作为编程语言不是很热情;)
使用 Java 8。
………………
线程“CamelMainRunController”中的异常java.lang.RuntimeException:org.apache.camel.FailedToCreateRouteException:无法在以下位置创建路由route2:>>> Marshal[org.apache.camel.model.dataformat.JaxbDataFormat@57d7f108] <<< in路线:Route(route2)[[From[activemq:gateway.queue]] -> [OnException... 因为无法创建数据格式'jaxb'。确保数据格式有效并且关联的 Camel 组件存在于 org.apache.camel.spring.boot.CamelSpringBootApplicationController.run(CamelSpringBootApplicationController.java:74) 处的类路径中 org.apache.camel.spring.boot.CamelMainRunController $DaemonTask.run(CamelMainRunController.java:42) at java.lang.Thread.run(Thread.java:745) 引起:org.apache.camel.FailedToCreateRouteException:无法在以下位置创建路由 route2:>>> Marshal[org.apache.camel.model.dataformat.JaxbDataFormat@57d7f108] <<< in route: Route(route2)[[From[activemq:gateway.queue]] -> [OnException... 因为数据无法创建格式“jaxb”。确保数据格式有效,并且关联的 Camel 组件存在于 org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition.java:1071) 的类路径中,位于 org.apache.camel.model.RouteDefinition.addRoutes(RouteDefinition) .java:196) 在 org.apache.camel.impl.DefaultCamelContext.startRoute(DefaultCamelContext.java:984) …
`java.lang.LinkageError: loader constraint violation: when resolving overridden method "com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshal
`Exception(Lorg/xml/sax/SAXException;)Ljavax/xml/bind/UnmarshalException;" the class loader (instance of org/powermock/core/classloader/MockClassLoader) of the current class, com/sun/xml/bind/v2/runtime/unmarshaller/UnmarshallerImpl, and its superclass loader (instance of <bootloader>), have different Class objects for the type org/xml/sax/SAXException used in the signature
Run Code Online (Sandbox Code Playgroud)
我正在使用 Powermock 在 JUNIT 测试用例中模拟静态类。由于我的 junit 使用 xml 文件,所以我收到了一些错误,我必须使用 powermock 忽略,如下所示。
@PowerMockIgnore({ "javax.xml.*"})
@RunWith(PowerMockRunner.class)
Run Code Online (Sandbox Code Playgroud)
我收到链接错误以及以下错误。请指教
javax.xml.transform.TransformerFactoryConfigurationError: Provider for class javax.xml.transform.TransformerFactory cannot be created
Run Code Online (Sandbox Code Playgroud) 背景:
我正在使用 JAXB 将 XML 解组为 Java 对象。最初,我只使用 JAXB 来执行解组。然后对代码进行了静态分析,并提出了 XML 外部实体注入的高危问题。经过一番研究后,我发现了一个建议(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXB_Unmarshaller)使用配置为防止解析外部实体的解析器。提供了该怎么做的示例:
//Disable XXE
SAXParserFactory spf = SAXParserFactory.newInstance();
spf.setFeature("http://xml.org/sax/features/external-general-entities", false);
spf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
spf.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
//Do unmarshall operation
Source xmlSource = new SAXSource(spf.newSAXParser().getXMLReader(), new InputSource(new StringReader(xml)));
JAXBContext jc = JAXBContext.newInstance(Object.class);
Unmarshaller um = jc.createUnmarshaller();
um.unmarshal(xmlSource);
Run Code Online (Sandbox Code Playgroud)
我没有完全按照所示方式完成此操作,但我相信我实际上已经做了相同的操作:
XMLReader reader = getXMLReader();
if (reader == null) {
logger.warn("Unable to create XML reader");
return;
}
JAXBContext context = JAXBContext.newInstance(messageClass);
Unmarshaller unmarshaller = context.createUnmarshaller();
for (File file : files) {
try { …Run Code Online (Sandbox Code Playgroud) 我是使用 jaxb2 的菜鸟。我收到此错误:“xpath:前缀必须解析为命名空间:xsd”,我不知道如何修复它。发生这种情况是因为我有两个 xsd 文件试图设计相同的类,但位于我的 java 应用程序的不同包中
<jxb:bindings schemaLocation="../documentazione/xsd/Global/datatypes_global_v62.xsd">
<jxb:schemaBindings>
<jxb:package name="com.companyname.plugin.entities.global" />
</jxb:schemaBindings>
<jxb:bindings node="//xsd:complexType[@name='Contact']">
<jxb:class name="GlobalContact" />
</jxb:bindings>
</jxb:bindings>
<jxb:bindings schemaLocation="../documentazione/xsd/Global/pickupdatatypes_global-3.0.xsd">
<jxb:schemaBindings>
<jxb:package name="com.companyname.plugin.entities.pickup" />
</jxb:schemaBindings>
<jxb:bindings node="xsd://complexType[@name='contact']" >
<jxb:class name="Contact" />
</jxb:bindings>
</jxb:bindings>
Run Code Online (Sandbox Code Playgroud)
我已经尝试运行该插件,但我不知道如何修复该错误。
本质上,我想做的是创建一个编组器,它可以接受我给它的任何类对象,例如汽车对象或人对象,并且它必须返回 XML 字符串。
这是我到目前为止所得到的:
public <T> String CreateXML(T objToSerialize)
{
String xml = "";
try
{
JAXBContext context = JAXBContext.newInstance(objToSerialize.getClass());
Marshaller marshaler = context.createMarshaller();
StringWriter writer = new StringWriter();
marshaler.marshal(objToSerialize.getClass(),writer);
xml = writer.toString();
System.out.println(xml);
return xml;
} catch (Exception e) {
System.out.println(e.getMessage());
}
return xml;
}
Run Code Online (Sandbox Code Playgroud)
它给了我以下错误:
警告:发生了非法反射访问操作
jaxb ×10
java ×7
xml ×4
binding ×2
maven ×2
apache-camel ×1
eclipselink ×1
jaxb2 ×1
json ×1
junit ×1
moxy ×1
namespaces ×1
powermock ×1
powermockito ×1
web-services ×1
xjc ×1
xsd ×1