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.1.0-SNAPSHOT and the official TCK passes around 90 % (see TCK status). Migration is not recommended in production until the listed gaps are closed. |
From Tomcat
| Tomcat | Foy | Note |
|---|---|---|
|
|
Programmatic configuration. The connector is Chappe, mounted through |
|
Identical |
Read by |
|
Identical |
Detected at compile time by APT — no runtime scan. |
|
Identical |
Likewise, merged with |
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 |
|
From Jetty (Servlet)
| Jetty | Foy | Note |
|---|---|---|
|
Chappe |
The connector is Chappe. |
|
|
|
|
|
Likewise. |
|
|
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. |
Known gaps
-
WebSocket Servlet 6.1 / Jakarta WebSocket 2.2 —
// TODO@user: planned, no date. -
Cross-context dispatch (
ServletContext.getContext) — not implemented, see TCK. -
JSP — not supported, not planned. For dynamic pages use Cassini (REST) or HTML-emitting Servlets.
-
Form-based / Digest authentication —
// TODO@user: in progress.
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-complete=truehonoured to the letter. Withfalse, APT-detected annotations take precedence — standard Servlet 6.1 behaviour. -
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 JPMS modules. If a legacy uses reflective
setAccessible(true), it needs an explicit--add-opens— better to port the legacy to@Inject.