Foy honours the Jakarta Servlet 6.1 spec to the letter — your web.xml, your @WebServlet, your filters and listeners are ported as-is. This page lists the points where the environment differs.
|
Foy is at 0.3.0 and the official TCK passes 95.6 % on the |
From Tomcat
| Tomcat | Foy | Note |
|---|---|---|
|
|
Programmatic configuration. The connector is Chappe; the Foy handler is mounted through the Chappe router ( |
|
Supported subset |
Read by |
|
Identical |
Detected at compile time by APT — no runtime scan. |
|
❌ Not implemented yet |
Web-fragment scanning and |
Coyote (HTTP/1.1, HTTP/2) |
HTTP/1.1 + HTTP/2 + virtual threads. |
|
|
|
Implement |
JNDI lookups ( |
|
Datasources / pools are CDI Vauban beans. |
|
CDI Vauban beans |
Foy ships no JNDI tree — port each |
From Jetty (Servlet)
| Jetty | Foy | Note |
|---|---|---|
|
Chappe |
The connector is Chappe. |
|
|
WAR deploy is not supported — Foy boots embedded, programmatically. |
|
|
Likewise. |
|
❌ Not implemented |
WebSocket Servlet 6.1 planned, no date. |
Custom Jetty |
Chappe |
The |
From Undertow
| Undertow | Foy | Note |
|---|---|---|
|
|
Two-step programmatic config: Chappe for transport, Foy for Servlet. |
|
Automatic |
No explicit Servlet/Filter config — annotations + |
Undertow |
Chappe |
See Chappe Reference. |
From Helidon Servlet
No real-world migration has been documented yet — the Tomcat and Jetty tables above transpose directly (programmatic boot, Chappe transport, SecurityProvider SPI).
Known gaps
-
Web fragments (
META-INF/web-fragment.xml) andmetadata-complete— not implemented yet; the top known gap, 81 % of TCK failures. See TCK. -
WebSocket Servlet 6.1 / Jakarta WebSocket 2.2 — not implemented (planned, no date).
-
JSP — not supported, not planned. For dynamic pages use Cassini (REST) or HTML-emitting Servlets.
-
Form-based / Digest authentication — not implemented.
-
Multipart — fully buffered in memory; limit/threshold handling partial.
Cross-context dispatch (ServletContext.getContext) is implemented via CrossContextRegistry — strict contextPath match on the contexts deployed in the same JVM.
Common pitfalls
-
No runtime
META-INF/servicesautoload. Foy does not useServiceLoaderat startup. If a Servlet library relies on aServletContainerInitializerloaded by scan, declare it as a CDI bean in Vauban. -
metadata-completeis not honoured yet. The attribute is not parsed: annotations andweb.xmlare always merged additively (a descriptor definition never overrides a name already discovered by annotation). If your application relies onmetadata-complete=trueto silence annotations, that behaviour is missing today. -
No runtime dynamic proxy. Frameworks that rely on it (Spring AOP, some profiling libs) won’t work as-is. Prefer APT alternatives (Vauban, Class-File API).
-
Strict Java modules. If a legacy uses reflective
setAccessible(true), it needs an explicit--add-opens— better to port the legacy to@Inject.