geoserver启动入口
org.geoserver.web.Start.main()
geoserver在servlet启动成功后的初始化入口
org.geoserver.GeoserverInitStartupListener.contextInitialized()
GeoTools.init((Hints) null); -- 初始化geotools log日志
src/web/app/src/main/webapp/WEB-INF/web.xml 文件配置了一系列容器listener
org.geoserver.GeoserverInitStartupListener
org.geoserver.logging.LoggingStartupContextListener
org.geoserver.platform.GeoServerContextLoaderListener
org.geoserver.platform.GeoServerHttpSessionListenerProxy
org.springframework.web.context.request.RequestContextListener
geoserver wfs 新增 InsertElementHandler.execute()
id的生成方式为gt-main.jar org.geotools.feature.FeatureBuilder.createDefaultFeatureId()
如果需要自己定义id可以在请求参数里面增加
<xsd:attribute default="UseExisting" name="idgen" type="wfs:IdentifierGenerationOptionType" use="optional"/>
取值有 UseExisting、ReplaceDuplicate、GenerateNew(默认)
具体可以参考 net.opengis.wfs.IdentifierGenerationOptionType
GenerateNew 生成一个新的id
UseExisting 使用用户设置的id
ReplaceDuplicate 使用用户设置的id,如果存在重复则生成新的id替换
请求入口
Dispatcher.handleRequestInternal()
//获取请求参数
request = init(request);
//获取处理请求的请求类
service = service(request);
loadServices();获取所有在spring xml文件中,注册了org.geoserver.platform.Service的对象
//获取请求类中对应的处理方法,并注入方法需要的参数
Operation operation = dispatch(request, service);
geoserver mysql插入数据时报错Column 'ID' specified twice
原因分析:
获取主键字段方法
jar包 org.geotools:gt-jdbc:26.4
PrimaryKeyFinder.getPrimaryKey()方法获取主键字段,
com.mysql.cj.jdbc.IterateBlock.doForAll() while循环里面断点分析:
先调用MetadataTablePrimaryKeyFinder.getPrimaryKey()在对应schema中获取schema中对应表的主键信息(对于mysql是获取不到的,因为页面无法配置schema)
如果获取不到,就调用HeuristicPrimaryKeyFinder.getPrimaryKey()在
ResultSet primaryKey = metaData.getPrimaryKeys(null, databaseSchema, tableName);
所有库中获取表对应的主键,
com.mysql.cj.jdbc.DatabaseMetaData.getPrimaryKeys()
此时如果2个库中有相同的表名,就会获取到2个主键id字段,导致生成的sql语句有问题,报错内容为:Column 'ID' specified twice
org.geotools.jdbc.JDBCDataStoreFactory.createDataStore()方法用于设置数据库连接信息,包含设置schema、设置主键对应的PrimaryKeyFinder类
geoserver获取配置的jdbc连接信息参数
org.geoserver.web.data.store.AbstractDataAccessPage.onSubmitInternal();
DataStoreInfo info = (DataStoreInfo) form.getModelObject(); -- 获取表单参数
org.geoserver.web.data.store.DataAccessEditPage.onSaveDataStore()
org.geoserver.catalog.ResourcePool.getDataStore()