简体   繁体   English

将Saxon与GeoTools一起使用

[英]Using Saxon with GeoTools

I am trying to get a project working using GeoTools with a dependency that uses Saxonica. 我正在尝试使用具有Saxonica依赖项的GeoTools来工作的项目。 So far, no luck 到目前为止,还没有运气

Project pom.xml dependencies: 项目pom.xml依赖项:

<dependencies>
  <dependency>
    <groupId>org.auscope.portal</groupId>
    <artifactId>portal-core</artifactId>
    <version>${portal.core.version}</version>
  </dependency>
  <dependency>
    <groupId>org.geotools</groupId>
    <artifactId>gt-main</artifactId>
    <version>14.2</version>
  </dependency>
</dependencies>

portal-core pom.xml relaveant dependencies: portal-core pom.xml相关关系:

<dependency>
  <groupId>net.sf.saxon</groupId>
  <artifactId>saxon-xom</artifactId>
  <version>8.7</version>
</dependency>
<dependency>
  <groupId>net.sf.saxon</groupId>
  <artifactId>saxon-xpath</artifactId>
  <version>8.7</version>
  <optional>false</optional>
</dependency>
<dependency>
  <groupId>net.sf.saxon</groupId>
  <artifactId>saxon-dom</artifactId>
  <version>8.7</version>
  <optional>false</optional>
</dependency>

SLDController.java code: SLDController.java代码:

StyleFactory styleFactory = CommonFactoryFinder.getStyleFactory(null);

StyledLayerDescriptor sld = styleFactory.createStyledLayerDescriptor();
sld.setName("example");
sld.setAbstract("Example Style Layer Descriptor");
UserLayer layer = styleFactory.createUserLayer();
layer.setName("layer");

FeatureTypeConstraint constraint = styleFactory.createFeatureTypeConstraint("Feature", Filter.INCLUDE, null);

layer.layerFeatureConstraints().add(constraint);

Style style = styleFactory.createStyle();

style.getDescription().setTitle("Style");
style.getDescription().setAbstract("Definition of Style");

layer.userStyles().add(style);
sld.layers().add(layer);

SLDTransformer styleTransform = new SLDTransformer();
String xml = styleTransform.transform(sld);

Stack trace: 堆栈跟踪:

net.sf.saxon.trans.XPathException: The SAX2 parser org.geotools.xml.transform.TransformerBase$XMLReaderSupport does not support setting the 'namespaces' feature to true
net.sf.saxon.event.Sender.configureParser(Sender.java:562)
net.sf.saxon.event.Sender.sendSAXSource(Sender.java:313)
net.sf.saxon.event.Sender.send(Sender.java:152)
net.sf.saxon.IdentityTransformer.transform(IdentityTransformer.java:39)
org.geotools.xml.transform.TransformerBase$Task.run(TransformerBase.java:300)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:133)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:121)
org.geotools.xml.transform.TransformerBase.transform(TransformerBase.java:162)
org.auscope.portal.server.web.controllers.SLDController.getOilAndGasStyle(SLDController.java:53)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:177)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446)
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
org.springframework.web.filter.ShallowEtagHeaderFilter.doFilterInternal(ShallowEtagHeaderFilter.java:82)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

I'm guessing this an issue that can be fixed using Maven, but I'm a bit lost. 我猜这是可以使用Maven修复的问题,但我有点迷茫。 How do I ensure that my project uses the right XSLT processor for GeoTools while not breaking the configuration of the portal-core dependency? 如何确保我的项目对GeoTools使用正确的XSLT处理器,同时又不破坏门户核心依赖项的配置?

Well, the message in the stack trace tells you exactly what's wrong: 好了,堆栈跟踪中的消息告诉您确切的问题所在:

The SAX2 parser org.geotools.xml.transform.TransformerBase$XMLReaderSupport does not support setting the 'namespaces' feature to true SAX2解析器org.geotools.xml.transform.TransformerBase $ XMLReaderSupport不支持将“命名空间”功能设置为true

Saxon by default gets hold of a SAX2 parser using the JAXP factory mechanism, and the parser it has found is one that belongs to the geotools project. 默认情况下,Saxon使用JAXP工厂机制来获取SAX2解析器,并且发现的解析器属于geotools项目。

The SAX2 specification says: "All XMLReaders are required to support setting http://xml.org/sax/features/namespaces to true" but it appears that this particular XMLReader does not allow this setting, and the result is that Saxon is unable to use this parser. SAX2规范说:“要求所有XMLReader支持将http://xml.org/sax/features/namespaces设置为true”,但是该特定XMLReader似乎不允许此设置,结果是Saxon无法使用此解析器。

There are all sorts of workarounds that might be possible, but devising one is going to need some knowledge of geotools, which I certainly don't have. 可能有各种各样的解决方法,但是设计一个解决方法将需要一些地质工具的知识,而我当然没有。 For example, I have no idea whether this parser is actually needed for the task in hand, or whether a different one would do. 例如,我不知道该解析器是否真正用于手头的任务,或者是否可以使用其他解析器。

The stack trace also shows that geotools is trying to do an identity transformation, and is using Saxon for the purpose. 堆栈跟踪还显示geotools正在尝试进行身份转换,并为此目的使用了Saxon。 It's probably picked up whatever transformer is lying around on the classpath, by using the JAXP factory mechanism to load it. 通过使用JAXP工厂机制来加载它,它可能会拾起类路径上的任何转换器。 That's a bad strategy: if you're going to use the JAXP mechanism to load your identity transformer, then you should test your code first to check that it works with the most common ones. 这是一个不好的策略:如果您要使用JAXP机制来加载身份转换器,那么您应该首先测试您的代码以检查其是否与最常见的代码兼容。 It might be possible to persuade geotools to use a different identity transformer by setting the relevant JAXP system property. 通过设置相关的JAXP系统属性,可以说服geotools使用其他标识转换器。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM