经过大量搜索,我终于找到了答案。希望这会帮助其他人。已经存在与此问题相关的其他线程,但是在不知道正确的关键字的情况下,我找不到响应。
解决方案是对架构工厂使用LSResourceResolver。即:
schemaFactory.setResourceResolver(new LSResourceResolver(){})LSResourceResolver()负责返回XSD所需的包含/导入资源。
搜索LSResourceResolver的SO中发现一些有用的主题:http://codingdict.com/questions/155814
我将在以后有更多时间的时候尝试发布自己的解决方案,但它会紧跟上述两个链接中已经提出的建议(通过使用Strings而不是stream简化了我的工作…)。
编辑
如所承诺的,这是我最后得到的代码片段:
// get the schemas used by this class final Map<String, String> schemas = new HashMap<String,String>(); schemas.putAll(generateSchemas(jc)); List<StreamSource> sources = new ArrayList<StreamSource>(); for( String schema : schemas.values() ) sources.add( new StreamSource( new ByteArrayInputStream(schema.getBytes()))); SchemaFactory sf = SchemaFactory.newInstance( XMLConstants.W3C_XML_SCHEMA_NS_URI ); sf.setResourceResolver(new LSResourceResolver() { @Override public LSInput resolveResource(String type, final String namespaceURI, String publicId, String systemId, String baseURI){ logger.debug( "Need to resolve Resource: " + namespaceURI ); return new LSInput(){ @Override public String getStringData() { // return the schema if found if( schemas.containsKey(namespaceURI)){ if( logger.isTraceEnabled()) logger.trace("resourceResolver: Resolving schema for namespace: " + namespaceURI + schemas.get(namespaceURI) ); return schemas.get(namespaceURI); } else return null; } @Override public Reader getCharacterStream() { return null; } @Override public void setCharacterStream(Reader paramReader) { } @Override public InputStream getByteStream() { return null; } @Override public void setByteStream(InputStream paramInputStream) { } @Override public void setStringData(String paramString) { } @Override public String getSystemId() { return null; } @Override public void setSystemId(String paramString) { } @Override public String getPublicId() { return null; } @Override public void setPublicId(String paramString) { } @Override public String getbaseURI() { return null; } @Override public void setbaseURI(String paramString) { } @Override public String getEncoding() { return null; } @Override public void setEncoding(String paramString) { } @Override public boolean getCertifiedText() { return false; } @Override public void setCertifiedText(boolean paramBoolean) { } }; } }); // validate the schema u.setSchema(sf.newSchema(sources.toArray(new StreamSource[]{})));和方法generateSchemas(jc):
private Map<String, String> generateSchemas (JAXBContext jaxbContext) throws JAXBException{ // generate the schemas final Map<String, ByteArrayOutputStream> schemaStreams = new linkedHashMap<String,ByteArrayOutputStream>(); try { jaxbContext.generateSchema(new SchemaOutputResolver(){ @Override public Result createOutput(String namespaceUri, String suggestedFileName) throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); logger.debug( "GenerateSchemas: adding namespace: " + namespaceUri); schemaStreams.put(namespaceUri, out); StreamResult streamResult = new StreamResult(out); streamResult.setSystemId(""); return streamResult; }}); } catch (IOException e) { // no IO being performed. Can safely ignore any IO exception. } // convert to a list of string Map<String,String> schemas = new linkedHashMap<String,String>(); for( Map.Entry<String, ByteArrayOutputStream> entry : schemaStreams.entrySet() ){ String schema = entry.getValue().toString(); String namespace = entry.getKey(); schemas.put(namespace, schema); } // done return schemas;}结束编辑
我希望这可以在将来对其他人有所帮助。
谢谢,



