Well, it isn't possible to spirit the "required=true" away, but even
if it were, this wouldn't help you as you don't want to change the XML
schema.
(1) Try this: edit the generated Java file, remove the required=true
and run your program as before. You'll get an exception/validation
error.
(2) Leave required=true, but remove the schema validation. You'll see
that JAXB tolerates the absent element; the field remains null.
Here's one way (rather inconvenient) but if the gov. threatens you
with terrible punishment:
Write a class like this, replacing Xyz with the name of the parent
element where Signature can be omitted:
class Cheater implements ValidationEventHandler{
public boolean handleEvent(ValidationEvent event){
ValidationEventLocator vel = event.getLocator();
System.out.println( "******* being called on: " + event );
System.out.println( "<" +event.getMessage() + ">" );
if( "cvc-complex-type.2.4.a: Invalid content was found starting with
element 'Xyz'. One of '{Signature}' is expected.".equals(
event.getMessage() ) || "cvc-complex-type.2.4.b: The content of
element 'Xyz' is not complete. One of '{Signature}' is
expected.".equals( event.getMessage() ) ){
return true;
} else {
return false;
}
}
Register with the unmarshaller:
Unmarshaller m = ...;
m.setEventHandler( new Cheater() );
You might use a more robust technique for matching the error message.
Notice that "One of '{Signature}'" may not be what *you* get - adapt
as required.
After all this rigmarole, note that what you'll be doing is indeed *a
change of the XML schema* - if not in its text but in its intended
effect. It would be far better to edit the XML schema, insert a
minOccurrence="0" and use *stable* code throughout. You can do this on
the fly using an XSLT transformation to insert just this attribute.
-W
On 09/08/2014, edsonrichter_at_hotmail.com <edsonrichter_at_hotmail.com> wrote:
> It is possible to overwrite the "required=true" in one element?
>
> Todays generated code (using NetBeans 8) is like:
>
> [code]
> @XmlAccessorType(XmlAccessType.FIELD)
> @XmlType(name = "TNFe", propOrder = {
> "infNFe",
> "signature"
> })
> public class TNFe {
>
> @XmlElement(required = true)
> protected TNFe.InfNFe infNFe;
> @XmlElement(name = "Signature", namespace =
> "http://www.w3.org/2000/09/xmldsig#", required = true)
> protected SignatureType signature;
> [/code]
>
> As you can see, the "Signature" element is required=true.
> I need to provide binding customatization so the generated code points
> to
>
> [code]
> @XmlAccessorType(XmlAccessType.FIELD)
> @XmlType(name = "TNFe", propOrder = {
> "infNFe",
> "signature"
> })
> public class TNFe {
>
> @XmlElement(required = true)
> protected TNFe.InfNFe infNFe;
> @XmlElement(required = false)
> protected SignatureType signature;
> [/code]
>
> How to accomplish that?
> I can't change the XSD file because it comes from goverment standards.
>
> Thanks,
>
> Edson
>