как может я неМаршалл в jaxb и обладать проверкой схемы, не используя явный файл схемы

Я использую jaxb для своих конфигураций приложения

Я чувствую, что делаю, что-то действительно изогнулось, и я ищу способ не нуждаться в фактическом файле или этой транзакции.

Поскольку Вы видите в коде I:

1.create схема в файл от моего JaxbContext (из моей аннотации класса на самом деле) 2.set этот файл схемы для разрешения истинной проверки, когда я неупорядочиваю

JAXBContext context = JAXBContext.newInstance(clazz);
Schema mySchema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI).newSchema(schemaFile);
jaxbContext.generateSchema(new MySchemaOutputResolver()); // ultimately creates schemaFile   
Unmarshaller u = m_context.createUnmarshaller();
u.setSchema(mySchema);
u.unmarshal(...);

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

Я должен создать схему для проверки, это выглядит избыточным, когда я получаю ее JaxbContect.generateSchema?

Как дела это?

13
задан ekeren 8 April 2010 в 23:58
поделиться

2 ответа

Что касается приведенного выше решения ekeren, не рекомендуется использовать PipedOutputStream / PipedInputStream в одном потоке, чтобы не переполнить буфер и не вызвать тупик. ByteArrayOutputStream / ByteArrayInputStream работает, но если ваши классы JAXB генерируют несколько схем (в разных пространствах имен), вам нужно несколько источников StreamSource.

В итоге я получил следующее:

JAXBContext jc = JAXBContext.newInstance(Something.class);
final List<ByteArrayOutputStream> outs = new ArrayList<ByteArrayOutputStream>();
jc.generateSchema(new SchemaOutputResolver(){
    @Override
    public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException {
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        outs.add(out);
        StreamResult streamResult = new StreamResult(out);
        streamResult.setSystemId("");
        return streamResult;
    }});
StreamSource[] sources = new StreamSource[outs.size()];
for (int i=0; i<outs.size(); i++) {
    ByteArrayOutputStream out = outs.get(i);
    // to examine schema: System.out.append(new String(out.toByteArray()));
    sources[i] = new StreamSource(new ByteArrayInputStream(out.toByteArray()),"");
}
SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI );
m.setSchema(sf.newSchema(sources));
m.marshal(docs, new DefaultHandler());  // performs the schema validation
13
ответ дан 2 December 2019 в 00:03
поделиться

Я считаю, что вам просто нужно установить ValidationEventHandler на вашем демаршаллере. Примерно так:

public class JAXBValidator extends ValidationEventCollector {
    @Override
    public boolean handleEvent(ValidationEvent event) {
        if (event.getSeverity() == event.ERROR ||
            event.getSeverity() == event.FATAL_ERROR)
        {
            ValidationEventLocator locator = event.getLocator();
            // change RuntimeException to something more appropriate
            throw new RuntimeException("XML Validation Exception:  " +
                event.getMessage() + " at row: " + locator.getLineNumber() +
                " column: " + locator.getColumnNumber());
        }

        return true;
    }
}

И в вашем коде:

Unmarshaller u = m_context.createUnmarshaller();
u.setEventHandler(new JAXBValidator());
u.unmarshal(...);
1
ответ дан 2 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: