我们有非托管扩展。我们在服务器和客户端之间实现了自定义通信API。
现在我们需要确保客户端和服务器具有相同的API版本。
一种解决方案 - 验证每个资源中的版本。但这种方法很混乱,导致代码重复。
我们想要的是实现我们自己的Filter并将其添加到Neo服务器。
这可能吗?如果是 - 那又怎么样?
答案 0 :(得分:3)
这是可能的!
方法有点棘手和脆弱,但它正在工作(blog post)。
您需要BinaryFormatter formatter = new BinaryFormatter();
using (MemoryStream serializedResourceStream = new MemoryStream(serializedResource))
{
object result = b.Deserialize(serializedResourceStream);
}
依赖项,因为它包含访问Neo4j Web服务器所需的neo4j-server
。
所以,请添加到SPIPluginLifecycle
:
pom.xml
创建过滤器。我们以此为例:
<dependency>
<groupId>org.neo4j.app</groupId>
<artifactId>neo4j-server</artifactId>
<version>${version.neo4j}</version>
</dependency>
此过滤器没有任何用处 - 只需继续进行链接。
现在很棘手。我们需要:
public class CustomFilter implements Filter {
public CustomFilter() {
}
@Override
public void init(final FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(final ServletRequest request,
final ServletResponse response,
final FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
}
@Override
public void destroy() {}
}
代码:
SPIPluginLifecycle
棘手的部分不是那么“合法”访问Web服务器。这可能在将来破裂,所以要小心。
注意public final class ExtensionPluginLifecycle implements SPIPluginLifecycle {
private WebServer webServer;
private CustomFilter customFilter;
@Override
public Collection<Injectable<?>> start(final NeoServer neoServer) {
webServer = getWebServer(neoServer);
addFilters();
}
@Override
public void stop() {
removeFilters();
}
@Override
public Collection<Injectable<?>> start(final GraphDatabaseService graphDatabaseService,
final Configuration config) {
throw new IllegalAccessError();
}
private WebServer getWebServer(final NeoServer neoServer) {
if (neoServer instanceof AbstractNeoServer) {
return ((AbstractNeoServer) neoServer).getWebServer();
}
throw new IllegalArgumentException(String.format("Expected: [AbstractNeoServer], Received: [%s].", neoServer));
}
private void addFilters() {
customFilter = new CustomFilter();
webServer.addFilter(customFilter, "/extension-path/*");
}
private void removeFilters() {
webServer.removeFilter(customFilter, "/extension-path/*");
}
}
和addFilters()
方法 - 这就是我们这样做的原因。
重要:生命周期插件应注册为服务:
removeFilters()