将Saxon与GeoTools结合使用

时间:2016-04-27 05:01:03

标签: java maven saxon xalan geotools

我正在尝试使用具有使用Saxonica的依赖项的GeoTools来开展项目。到目前为止,没有运气

项目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相关依赖:

<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代码:

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);

堆栈追踪:

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)

我猜这是一个可以使用Maven解决的问题,但我有点迷失了。如何在不破坏门户核心依赖关系配置的情况下,确保我的项目为GeoTools使用正确的XSLT处理器?

1 个答案:

答案 0 :(得分:1)

好吧,堆栈跟踪中的消息告诉你到底出了什么问题:

SAX2解析器org.geotools.xml.transform.TransformerBase $ XMLReaderSupport不支持将“命名空间”功能设置为true

Saxon默认使用JAXP工厂机制获取SAX2解析器,它找到的解析器是属于geotools项目的解析器。

SAX2规范说:“所有XMLReader都需要支持将http://xml.org/sax/features/namespaces设置为true”,但似乎这个特定的XMLReader不允许这种设置,结果是Saxon无法使用这个解析器。

可能有各种各样的解决方法,但设计一个可能需要一些geotools的知识,我当然没有。例如,我不知道手头的任务是否真的需要这个解析器,或者是否会有不同的解析器。

堆栈跟踪还显示geotools正在尝试进行身份转换,并且正在使用Saxon。通过使用JAXP工厂机制加载它,它可能会拾取类路径上的变压器。这是一个糟糕的策略:如果你打算使用JAXP机制来加载你的身份转换器,那么你应该首先测试你的代码,检查它是否适用于最常见的代码。通过设置相关的JAXP系统属性,可以说服geotools使用不同的身份变换器。