XSD to Java custom datatype - java

I have xsd which contain the following: type="EAIschema:eCodes" where eCodes is another schema. When I compile it using xjc it returns:
"Cannot resolve the name 'EAIschema:eCodes' to a(n) 'type definition' component"
I want to know how to solve this problem

I'm not 100% sure about the error message, but it looks to me as if the JAXB classes for the other XSD were missing. If your XSD uses data structures of the other XSD then your JAXB classes will need those JAXB classes.
Solution: generate/ add the JAXB classes for the other XSD to your classpath.
If those classes are in a separate JAR, make sure it contains an episode file.

When the XJC tool is converting the XML schema(s) to Java classes it will automatically pull in imported/included schemas based on their system id. It those schemas are not available at the specified system id (or its not specified) then you could use an XML catalog.
For More Information
http://blog.bdoughan.com/2011/10/jaxb-xjc-imported-schemas-and-xml.html

Related

How does xsi:schemaLocation work with IntelliJ IDEA?

I am a little confused with how does xml xsi:schemaLocation works.
I am using Maven + IDEA to create a Spring project.
If miss org.springframework.spring-beans in my dependency, IDEA will warn me some error.
If I add this jar, warn will disappear.
Maybe it is not important, but it like a black magic to me, can any one help me how does this work?
Those XSDs are in fact included in the jar provided by spring. You can check this by doing a double shift and typing in the XSD's filename. So if you don't include the jar, your maven project cannot locate the XSD in your classpath.
The XSD you mentioned can be found here, as part of the spring-beans module
IntelliJ IDEA is helpfully indicating that it cannot location the XSD that it needs to validate the Spring project.
It turns the default namespace (beans/#xmls) red because it uses that along with the paired value of the namespace given by xsi:schemaLocation (also red) in order to find the governing XSD. Note that this does not necessarily have to be at the URL given by the paired value xsi:schemaLocation (https://www.springframework.org/schema/beans/spring-beans.xsd). Other mechanisms, including as XML Catalogs, can aid in the resolution of where the actual XSD can be found.
In this case, IDEA knows to check JARs on the classpath for the needed XSD.
See also:
How to link XML to XSD using schemaLocation or noNamespaceSchemaLocation?
xmlns, xmlns:xsi, xsi:schemaLocation, and targetNamespace?
How to reference a local XML Schema file correctly?
Must an XML namespace name URI be retrievable?

How to create service first soap webservice using spring-boot

We can see many tutorials that shows how to produce soap webservice using xsd in spring-boot. Is it possible to create soap webservice without xsd and from plain Java code using spring-boot-webservice module like we do using #webservice annotation in jax-ws
Guides like this start with an xsd file because they use xjc to create java classes from the XSD definition. xjc creates classes with JaxB annotations (javax.xml.bind.annotation). JaxB is an xml binding specification that has been part of the JDK since 1.6, and it requires that all types from the xsd exist as java classes.
I suggest that you do a tutorial that starts with an xsd an take a look at the auto generated classes. There is nothing to prevent you from writing you own classes instead of generating them from a wsdl, and if you don't refer to external schemas I prefer to do the code only approach (I hate xml configuration).
If you look at the tutorial, the gradle task "getJaxb" will create .java files into "build/generated-sources" compile them and copy them into "build/classes" if you copy the *.java files into "src/main/java" (keep the package structure) and delete delete/disable the "genJaxb" task in gradle, and delete your build folder, everything still works (it actually works better since you normally have red lines in your IDE because the XML beans don't exist until you run the generator the first time).
Now all you need to do is master the JaxB annotations, so you can write your own beans.

Create POJO class structure using JAXB from XML

I have looked at below mentioned question:
Java JAXB how to create POJO classes
Java JAXB xml pojo classes
Here is what I want to do.
I want to use JAXB and create POJO Java classes at runtime. If I change my XML in future, I don't need to make change POJO Java class structure manually. I need to only restart whole Java Application and it will generate all classes at runtime without user input
FYI :-
using XJC is not helpful as i can not merge it into application.
I have already automated whole business logic which is not affected by XML file.
Here are some maven modules which you may find helpful
jaxb2-maven-plugin
Mojo's JAXB-2 Maven plugin is used to create an object graph from XSDs based on the JAXB 2.1 implementation and to generate XSDs from JAXB annotated Java classes.
maven-jaxb2-plugin
This Maven plugin wraps and enhances the JAXB Schema Compiler (XJC) and allows compiling XML Schemas (as well as WSDL, DTDs, RELAX NG) into Java classes in Maven builds.
jaxb2-maven-plugin
This plugin uses the Java API for XML Binding (JAXB), version 2+, to generate Java classes from XML Schemas (and optionally binding files) and to create XML Schemas from annotated Java classes

Error using XJC with xml.xsd import: "Failed to read schema document 'xml.xsd'"

I'm trying to run xjc on a Third-party's schema files (it's Amazon.com's product API). Well I'm running into trouble because with one of the files, default.xsd, xjc is borking on the following import (it's the first one right after the schema declaration):
<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd" />
I'm not an expert on XML, but I thought xml.xsd was part of the "core" XML/XSD library and that XJC would know the details of this library by default. But when I run the task I get this error:
[WARNING] schema_reference.4: Failed to read schema document
'xml.xsd', because 1) could not find the document; 2) the document
could not be read; 3) the root element of the document is not
. line 9 of file:/C:/temp/amazon/default.xsd
[ERROR] src-resolve: Cannot resolve the name 'xml:lang' to a(n)
'attribute declaration' component. line 119 of
file:/C:/temp/amazon/default.xsd
I tried downloading the xml.xsd file from http://www.w3.org/2001/03/xml.xsd to the directory with these schema files and running the command again, but xml.xsd doesn't validate:
[ERROR] schema_reference.4: Failed to read schema document
'file:/C:/temp/amazon/xml.xsd', because 1) could not find the
document; 2) the document could not be read; 3) the root element of
the document is not . unknown location
I was about to start going down the rabbit hole of why this wouldn't be validated, but decided to hold off since I think I'm missing something really simple or small. Do I need to manually include the xml.xsd import or am I missing something else?
The urls for the schema I am working with are currently here:
http://g-ecx.images-amazon.com/images/G/01/mwsportal/doc/en_US/products/default.xsd
and here
http://g-ecx.images-amazon.com/images/G/01/mwsportal/doc/en_US/products/ProductsAPI_Response.xsd
And I'm simply using:
xjc dirname
together at once or
xjc filename
to try to parse them one-by-one
I downloaded your XSD files to mimic the error and indeed, when downloaded as is they give exactly the error you reported.
It wasn't immediately obvious what was happening. Yes, the XML namespace http://www.w3.org/XML/1998/namespace is special and reserved. You do not have to declare it for it to be in existence, but the xml.xsd file is used for Schema compliance, so that these predefined types are also defined in the XSD Schema, so that the types can be used in using schemas.
So my first thoughts were with the XML namespace needing to be declared as xmlns:xml="http://www.w3.org/XML/1998/namespace" (normally this is never needed) for XJC to behave normally, but that didn't change much.
After a bit going back and forth, I decided to run xjc with the option -nv, which turns of certain strict validation rules. This time, the error I received was a bit clearer and immediately pointed to the cause, and the obvious solution:
[ERROR] failed to retrieve 'file:/D:/Projects/xyz/XMLSchema.dtd': java.io.FileNotFoundException: D:\Projects\xyz\XMLSchema.dtd (The system cannot find the file specified)
line 2 of file:/D:/Projects/xyz/xml.xsd
Apparently, XJC tries to download the DTD referenced by the DOCTYPE declaration:
<!DOCTYPE xs:schema PUBLIC "-//W3C//DTD XMLSCHEMA 200102//EN" "XMLSchema.dtd" >
Actually, this isn't XJC, but the XML parser that precedes XSD validation. The XML parser used is a validating parser, which means it tries to find the DTD and if it cannot, it breaks. The error you received is not very helpful, but correct, as in XML terms, an XML file that points to a DTD is not a valid XML file (but it can be a well-formed XML file and non-validating XML processors, not to be confused with XSD schema validation, will simply load the XML).
Solution
However, the DTD is not required for the XML to be considered correct. You can either download the XMLSchma DTD, or, easier, simply remove that line and the processing will succeed, with or without the -nv switch.
You can use catalogs to fix this type of errors:
Assume one or more of your schemas reference a resource via invalid URL.
Find this resource (is probably available from some alternative location) and save it locally.
Create a catalog file to rewrite the URL. You can rewrite via namespace or via file location:
PUBLIC "http://www.w3.org/XML/1998/namespace" "w3c/2001/03/xml.xsd"
REWRITE_SYSTEM "http://www.w3.org/2001/03/xml.xsd" "w3c/2001/03/xml.xsd"
(Local file location is w3c/2001/03/xml.xsd.)
Use it as xjc -catalog mycatalog.cat ...
You can do the same fo DTDs as well. I normally rewrite just "http://www.w3.org" -> "w3c" and keep the folder structure the same as on the server.
Using -nv is a good idea, works better with catalogs in any case:
https://github.com/highsource/maven-jaxb2-plugin/wiki/Catalogs-in-Strict-Mode
Links:
https://github.com/highsource/maven-jaxb2-plugin/wiki/Using-Catalogs
https://jaxb.java.net/guide/Fixing_broken_references_in_schema.html
http://blog.bdoughan.com/2011/10/jaxb-xjc-imported-schemas-and-xml.html
https://github.com/highsource/w3c-schemas (I'm the author of this one.)

jaxb - xsd to java class for specified node

I have an XSD file with many ComplexType defined in it. I'm using XJC to generate java classes from the XSD file. It will generate classes for all the CompleXType node defined in the schema file. Is there any way I can use a filter in xjc command so that I can get classes of the specified ComplexType only, Instead of generating classes for the whole XSD file?
You can use binding files to somewhat achieve that:
Use <jaxb:schemaBindings map="false" ... /> to disable generation for the whole namespace/schema
Use <jaxb:class ref="com.acme.foo.Ignore"/> to map "unwanted" classes to some (existing) com.acme.foo.Ignore class.

Categories