栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何控制JAXB内存中架构生成的顺序/顺序?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何控制JAXB内存中架构生成的顺序/顺序?

经过大量搜索,我终于找到了答案。希望这会帮助其他人。已经存在与此问题相关的其他线程,但是在不知道正确的关键字的情况下,我找不到响应。

解决方案是对架构工厂使用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;}

结束编辑

我希望这可以在将来对其他人有所帮助。

谢谢,



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/454976.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号