Проверка JAXB 2.0 не работает - PullRequest
0 голосов
/ 09 декабря 2010

Я работаю над JAXB 2.0 и в настоящее время проверяю часть проверки, поскольку она не работает, как ожидалось. ниже приведен код подтверждения

public void validateXMLToSchema(Unmarshaller ummarshaller,String xsdFileName) throws SAXException, JAXBException{
    System.out.println(getClass().getResource(DEFAULT_XSD_NAME).toString());
    Schema schema;
    SchemaFactory schemaFactory=SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    if(null==xsdFileName)
        schema=schemaFactory.newSchema(getClass().getResource(DEFAULT_XSD_NAME));

    else
        schema=schemaFactory.newSchema(new File(xsdFileName));

    ummarshaller.setSchema(schema);
    ummarshaller.setEventHandler( new ValidationEventHandler() {

        @Override
        public boolean handleEvent(ValidationEvent validationevent) {
            if(validationevent.getSeverity()==ValidationEvent.FATAL_ERROR || validationevent.getSeverity()==ValidationEvent.ERROR || validationevent.getSeverity()==ValidationEvent.WARNING){
                ValidationEventLocator  locator = validationevent.getLocator();
                log.info("Line:Col[" + locator.getLineNumber()
                        + ":" + locator.getColumnNumber()
                        + "]:" + validationevent.getMessage());
            }
            return true;
        }
    });

}

а вот и вызов метода

Destination destination=new Destination();
    try {
         destination=(Destination)unmarshal(Destination.class,new FileInputStream(new File("C:/Users/Raisonne/Desktop/jaxb/jaxb-ri-20101119/bin/destination.xml")));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (JAXBException e) {
        e.printStackTrace();
    }
    System.out.println(destination.getName());

}

public static <T> T unmarshal( Class<T> docClass, InputStream inputStream )
throws JAXBException, SAXException {
String packageName = docClass.getPackage().getName();
JAXBContext jc = JAXBContext.newInstance( packageName );
Unmarshaller u = jc.createUnmarshaller();
XMLValidator xmlValidator=new XMLValidator();
xmlValidator.validateXMLToSchema(u, null);

у меня есть несколько полей как обязательные поля в соответствии с XSD, но даже удаляя их, я получаю ошибку, когда ничего не даю, и анализирую мой xml-файл для соответствующего объекта Может ли какой-то один пункт, что идет не так?

здесь часть XSD

    <xs:element name="destination" type="Destination"/>
  <xs:complexType name="Destination">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="destinationID" type="xs:string" minOccurs="0"/>
      <xs:element name="shortDescription" type="xs:string" minOccurs="0"/>
      <xs:element name="longDescription" type="xs:string" minOccurs="0"/>
      <xs:element name="stateID" type="xs:string"/>
      <xs:element name="typeCode" type="xs:int"/>
      <xs:element name="countryCode" type="xs:string"/>
      <xs:element name="categories" type="xs:string"/>
      <xs:element name="transport" type="Transport" minOccurs="0" maxOccurs="1"/>
      <xs:element name="culture" type="Culture" minOccurs="0" maxOccurs="1"/>
      <xs:element name="events" type="Events" minOccurs="0" maxOccurs="1"/>
      <xs:element name="placesToVisit" type="PlacesToVisit" minOccurs="0" maxOccurs="1"/>
      <xs:element name="contacts" type="Contact" minOccurs="0" maxOccurs="1"/>
      <xs:element name="addresses" type="address" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

и сгенерированный файл Java

@XmlElement(required = true)
protected String name;
protected String destinationID;
protected String shortDescription;
protected String longDescription;
@XmlElement(required = true)
protected String stateID;

Я удалял StateID из XML-файла, но в части проверки все еще нет тревоги

заранее спасибо

Ответы [ 3 ]

1 голос
/ 09 декабря 2010

Ваш фрагмент кода немного сложен для понимания, действительно ли происходит демаршал? Возможно, вам придется добавить последнюю строку в ваш метод unmarshal:

public static <T> T unmarshal( Class<T> docClass, InputStream inputStream ) throws JAXBException, SAXException {
    String packageName = docClass.getPackage().getName();
    JAXBContext jc = JAXBContext.newInstance( packageName );
    Unmarshaller u = jc.createUnmarshaller();
    XMLValidator xmlValidator=new XMLValidator();
    xmlValidator.validateXMLToSchema(u, null);
    u.unmarshal(inputStream);
}
0 голосов
/ 09 декабря 2010

Действительно странно, когда я изменил свой код на это

public class UnMarshallXML {

/**
 * @param args
 * @throws SAXException 
 */
public static void main(String[] args) throws SAXException {
    Destination destination=new Destination();
    try {
         destination=(Destination)unmarshal(Destination.class,new FileInputStream(new File("C:/Users/Raisonne/Desktop/jaxb/jaxb-ri-20101119/bin/destination.xml")));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (JAXBException e) {
        e.printStackTrace();
    }
    System.out.println(destination.getName());

}

public static <T> T unmarshal( Class<T> docClass, InputStream inputStream )
throws JAXBException, SAXException {
String packageName = docClass.getPackage().getName();
System.out.println(packageName);
JAXBContext jc = JAXBContext.newInstance( packageName );
Unmarshaller u = jc.createUnmarshaller();
SchemaFactory schemaFactory=SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Schema schema=schemaFactory.newSchema(new File("C:/Users/Raisonne/Desktop/jaxb/jaxb-ri-20101119/bin/destination.xsd"));

u.setSchema(schema);
u.setEventHandler(
        new ValidationEventHandler() {
            // allow unmarshalling to continue even if there are errors
            public boolean handleEvent(ValidationEvent ve) {
                // ignore warnings
                if (ve.getSeverity() != ValidationEvent.WARNING) {
                    ValidationEventLocator vel = ve.getLocator();
                    System.out.println(
                            "Line:Col[" + vel.getLineNumber()
                            + ":" + vel.getColumnNumber()
                            + "]:" + ve.getMessage());
                }

                return true;
            }
        });
// XMLValidator xmlValidator=new XMLValidator();
//xmlValidator.validateXMLToSchema(u, null,inputStream);
@SuppressWarnings("unchecked")
JAXBElement<T> doc = (JAXBElement<T>)u.unmarshal( inputStream );
return doc.getValue();

}

}

все стало работать как шарм ..

0 голосов
/ 09 декабря 2010

По этой строке

xmlValidator.validateXMLToSchema(u, null);

вы не передаете имя файла XSD XmlValidator. Это должно быть что-то вроде

xmlValidator.validateXMLToSchema(u, "/opt/projects/myschema.xsd");

Редактировать: Ну, вот как мне удалось это сделать, и он отлично работает:

void validate(MyRequest requestParameters) throws IllegalArgumentException,MalformedURLException,SAXException {
    try {
        JAXBContext context = JAXBContext.newInstance(MyRequest.class.getPackage().getName());
        Marshaller marshaller = context.createMarshaller();
        marshaller.setSchema(getSchema());
        JAXBElement<MyRequest> rootElement = new JAXBElement<SearchCustomersRequest>(new QName("http://mysite.com/xsd/myproject/", "MyRequest"),
                        MyRequest.class, requestParameters);
        marshaller.marshal(rootElement, new DefaultHandler());
        log.debug("Validation successful");
    } catch (JAXBException e) {
        throw new IllegalArgumentException("Invalid request parameters: " + e.toString(), e);
    }
}

private Schema getSchema() throws MalformedURLException, SAXException {
    if (schema == null) {
        SchemaFactory factory = SchemaFactory.newInstance(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI);
        URL schemaUrl = new URL("http://mysite.com/xsd/myproject/schema-1.0.xsd");
        schema = factory.newSchema(schemaUrl);
    }
    return schema;
}
...