I am using the following code for insert / update (changed from this source: https://medium.com/@goldrydigital/wfs-t-with-openlayers-3-16-6fb6a820ac58):
var formatWFS = new ol.format.WFS();
// GML Format zur Interaktion mit WFS
var formatGML = new ol.format.GML({
featureNS: 'http://my-address:8080/geoserver/web/myworkspace',
featureType: 'MyWorkspace:MyLayer',
srsName: myProjectionName
});
var transactWFS = function(transactionType,feature) {
var node;
switch(transactionType) {
case 'insert':
node = formatWFS.writeTransaction([feature],null,null,formatGML);
break;
case 'update':
node = formatWFS.writeTransaction(null,[feature],null,formatGML);
break;
case 'delete':
node = formatWFS.writeTransaction(null,null,[feature],formatGML);
break;
}
s = new XMLSerializer();
str = s.serializeToString(node);
// XMLHttpRequest
var xhttp = new XMLHttpRequest();
var url = 'http://my-address:8080/geoserver/web/myworkspace/wfs';
xhttp.open('POST', url, true);
//xhttp.setRequestHeader('crossDomain', true);
xhttp.setRequestHeader('dataType', 'xml');
//xhttp.setRequestHeader('processData', false);
xhttp.setRequestHeader('contentType', 'text/xml');
//xhttp.onreadystatechange = handler;
xhttp.send(str);
xhttp.onreadystatechange = function() {
console.log("Request Response: " + xhttp.responseText);
};
}
The insert works like it should using this function:
// Button to add a Feature
$("#btn_add").click(function(e){
e.preventDefault();
// create feature from draw feature
var feature = drawSource.getFeatures()[0];
// set properties
feature.setProperties({
NAME: $("#name").val(),
AGE: $("#age").val(),
GEOLOC: feature.getGeometry()
});
// Insert feature
transactWFS('insert', feature);
});
For update I am using this functions (taking values from text field like in the insert function and not changing the geometry):
// Button to change a Feature
$("#btn_change").click(function(e){
e.preventDefault();
// get selected feature from map (selectedFeature)
var feature = selectedFeature;
feature.setProperties({
NAME: $("#name").val(),
AGE: $("#age").val()
});
// update feature
transactWFS('update', feature);
});
The update function is throwing this exception
<ows:Exception exceptionCode="NoApplicableCode">
<ows:ExceptionText>Feature type 'MyWorkspace:MyLayer' is not available: </ows:ExceptionText>
</ows:Exception>
The feature type is not changed so I do not know why the insert is working but the update is not.
The "geoserver.log" Error Information (DEBUG level):
2015-12-01 11:36:22,184 INFO [geoserver.wfs] –
Request: getServiceInfo
2015-12-01 11:36:22,200 DEBUG [geotools.xml] – schemaLocation found: http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd
2015-12-01 11:36:22,200 DEBUG [geotools.xml] – Found override for http://www.opengis.net/wfs: http://schemas.opengis.net/wfs/1.1.0/wfs.xsd ==> jar:file:/C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%208.0/webapps/geoserver/WEB-INF/lib/gs-wfs-2.8.0.jar!/org/geoserver/wfs/xml/v1_1_0/wfs.xsd
2015-12-01 11:36:22,200 DEBUG [geoserver.wfs] – Locating FeatureSource uri:'http://my-address:8080/geoserver/web/myworkspace' name:'MyWorkspace:MyLayer'
2015-12-01 11:36:22,200 ERROR [geoserver.ows] –
org.geoserver.wfs.WFSTransactionException: Feature type 'MyWorkspace:MyLayer' is not available:
at org.geoserver.wfs.Transaction.execute(Transaction.java:221)
at org.geoserver.wfs.Transaction.transaction(Transaction.java:106)
at org.geoserver.wfs.DefaultWebFeatureService.transaction(DefaultWebFeatureService.java:171)
at sun.reflect.GeneratedMethodAccessor577.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.geoserver.ows.util.RequestObjectLogger.invoke(RequestObjectLogger.java:55)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at com.sun.proxy.$Proxy61.transaction(Unknown Source)
at sun.reflect.GeneratedMethodAccessor576.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.geoserver.ows.Dispatcher.execute(Dispatcher.java:845)
at org.geoserver.ows.Dispatcher.handleRequestInternal(Dispatcher.java:275)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.geoserver.filters.ThreadLocalsCleanupFilter.doFilter(ThreadLocalsCleanupFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:75)
at org.geoserver.wms.animate.AnimatorFilter.doFilter(AnimatorFilter.java:71)
at org.geoserver.filters.SpringDelegatingFilter$Chain.doFilter(SpringDelegatingFilter.java:71)
at org.geoserver.filters.SpringDelegatingFilter.doFilter(SpringDelegatingFilter.java:46)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.geoserver.platform.AdvancedDispatchFilter.doFilter(AdvancedDispatchFilter.java:50)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311)
at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:69)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:73)
at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:69)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:73)
at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.geoserver.security.filter.GeoServerAnonymousAuthenticationFilter.doFilter(GeoServerAnonymousAuthenticationFilter.java:54)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:69)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:73)
at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)
at org.geoserver.security.filter.GeoServerBasicAuthenticationFilter.doFilter(GeoServerBasicAuthenticationFilter.java:83)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:69)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.geoserver.security.filter.GeoServerSecurityContextPersistenceFilter$1.doFilter(GeoServerSecurityContextPersistenceFilter.java:53)
at org.geoserver.security.filter.GeoServerCompositeFilter$NestedFilterChain.doFilter(GeoServerCompositeFilter.java:73)
at org.geoserver.security.filter.GeoServerCompositeFilter.doFilter(GeoServerCompositeFilter.java:92)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173)
at org.geoserver.security.GeoServerSecurityFilterChainProxy.doFilter(GeoServerSecurityFilterChainProxy.java:135)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.geoserver.filters.LoggingFilter.doFilter(LoggingFilter.java:87)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.geoserver.filters.GZIPFilter.doFilter(GZIPFilter.java:42)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.geoserver.filters.SessionDebugFilter.doFilter(SessionDebugFilter.java:48)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.geoserver.filters.FlushSafeFilter.doFilter(FlushSafeFilter.java:44)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:217)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:673)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2503)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2492)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)
2015-12-01 11:36:22,200 DEBUG [geoserver.filters] – Compressing output for mimetype: application/xml
2015-12-01 11:36:22,200 DEBUG [filter.GeoServerSecurityContextPersistenceFilter$1] – SecurityContextHolder now cleared, as request processing completed
And the input log to compare:
2015-12-01 11:43:58,111 DEBUG [geotools.xml] – schemaLocation found: http://www.opengis.net/wfs http://schemas.opengis.net/wfs/1.1.0/wfs.xsd
2015-12-01 11:43:58,111 DEBUG [geotools.xml] – Found override for http://www.opengis.net/wfs: http://schemas.opengis.net/wfs/1.1.0/wfs.xsd ==> jar:file:/C:/Program%20Files/Apache%20Software%20Foundation/Tomcat%208.0/webapps/geoserver/WEB-INF/lib/gs-wfs-2.8.0.jar!/org/geoserver/wfs/xml/v1_1_0/wfs.xsd
2015-12-01 11:43:58,111 DEBUG [geotools.xml] – Could not find declaration for: {http://my-address:8080/geoserver/web/myworkspace}geometry. Checking if containing type declares a single particle.
2015-12-01 11:43:58,111 DEBUG [geotools.xml] – Could not find declaration for: {http://my-address:8080/geoserver/web/myworkspace}geometry. Performing lookup by ignoring namespace
2015-12-01 11:43:58,111 DEBUG [geotools.xml] – Could not find declaration for: {http://my-address:8080/geoserver/web/myworkspace}geometry. Creating a mock element declaration and parsing anyways…
2015-12-01 11:43:58,126 DEBUG [geoserver.wfs] – Locating FeatureSource uri:'http://my-address:8080/geoserver/web/myworkspace' name:'MyLayer'
2015-12-01 11:43:58,126 DEBUG [geoserver.wfs] – located FeatureType w/ typeRef 'ORACLE MYDATASTORE:MyLayer' and elementName '{http://my-address:8080/geoserver/web/myworkspace}MyLayer'
2015-12-01 11:43:58,126 DEBUG [geoserver.wfs] – Transasction Insert:org.geoserver.wfs.request.Insert$WFS11@60401ca0
2015-12-01 11:43:58,126 TRACE [geotools.factory] – ENTRY (CoordinateOperationFactory, COORDINATE_OPERATION_FACTORY)
2015-12-01 11:43:58,126 TRACE [geotools.factory] – RETURN (CoordinateOperationFactory, COORDINATE_OPERATION_FACTORY): found implementation BufferedCoordinateOperationFactory.
2015-12-01 11:43:58,126 DEBUG [geoserver.wfs] – Use featureValidation to check contents of insert
Best Answer
There was an error in the GML Format featureType Parameter:
The featureType just needs the layername and not the "Workspace:LayerName"-format!