Beta
Thread-safe Webhook Servlet to receive notifications using the jakarta.servlet namespace.
In order to use this servlet you should create a class inheriting from NotificationServlet and register the servlet in your web.xml.
It is a simple wrapper around WebhookUtils#processWebhookNotification, so if you you
may alternatively call that method instead from your HttpServlet#doPost with no loss of
functionality. Example usage:
WARNING: by default it uses MemoryDataStoreFactory#getDefaultInstance() which means it
will NOT persist the notification channels when the servlet process dies, so it is a BAD CHOICE
for a production application. But it is a convenient choice when testing locally, in which case
you don't need to override it, and can simply reference it directly in your web.xml file. For
example:
Constructor to be used for testing and demo purposes that uses MemoryDataStoreFactory#getDefaultInstance() which means it will NOT persist the notification
channels when the servlet process dies, so it is a bad choice for a production application.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-15 UTC."],[],[],null,["# Class NotificationServlet (2.8.1)\n\nVersion latestkeyboard_arrow_down\n\n- [2.8.1 (latest)](/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [2.8.0](/java/docs/reference/google-api-client/2.8.0/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [2.7.2](/java/docs/reference/google-api-client/2.7.2/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [2.6.0](/java/docs/reference/google-api-client/2.6.0/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [2.5.1](/java/docs/reference/google-api-client/2.5.1/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [2.4.1](/java/docs/reference/google-api-client/2.4.1/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [2.1.2](/java/docs/reference/google-api-client/2.1.2/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [2.0.1](/java/docs/reference/google-api-client/2.0.1/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [1.35.2](/java/docs/reference/google-api-client/1.35.2/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [1.34.1](/java/docs/reference/google-api-client/1.34.1/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet)\n- [1.33.4](/java/docs/reference/google-api-client/1.33.4/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet) \n\n public class NotificationServlet extends HttpServlet\n\nBeta \n\nThread-safe Webhook Servlet to receive notifications using the `jakarta.servlet` namespace.\n\nIn order to use this servlet you should create a class inheriting from [NotificationServlet](/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.extensions.servlet.notifications.jakarta.NotificationServlet) and register the servlet in your web.xml.\n\nIt is a simple wrapper around [WebhookUtils#processWebhookNotification](/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.extensions.servlet.notifications.WebhookUtils#com_google_api_client_googleapis_extensions_servlet_notifications_WebhookUtils_processWebhookNotification_), so if you you\nmay alternatively call that method instead from your HttpServlet#doPost with no loss of\nfunctionality. **Example usage:** \n\n\n public class MyNotificationServlet extends NotificationServlet {\n\n private static final long serialVersionUID = 1L;\n\n public MyNotificationServlet() throws IOException {\n super(new SomeDataStoreFactory());\n }\n }\n \n**Sample web.xml setup:** \n\n\n {@literal \u003c}servlet{@literal\u003e}\n {@literal \u003c}servlet-name{@literal\u003e}MyNotificationServlet{@literal \u003c} ervlet-name{@literal=\"\"\u003e}\n {@literal \u003c}servlet-class{@literal\u003e}\n com.mypackage.MyNotificationServlet\n {@literal \u003c} ervlet-class{@literal=\"\"\u003e}\n {@literal \u003c} ervlet{@literal=\"\"\u003e}\n {@literal \u003c}servlet-mapping{@literal\u003e}\n {@literal \u003c}servlet-name{@literal\u003e}MyNotificationServlet{@literal \u003c} ervlet-name{@literal=\"\"\u003e}\n {@literal \u003c}url-pattern{@literal\u003e}/notifications{@literal \u003c} rl-pattern{@literal=\"\"\u003e}\n {@literal \u003c} ervlet-mapping{@literal=\"\"\u003e}\n \nWARNING: by default it uses MemoryDataStoreFactory#getDefaultInstance() which means it\nwill NOT persist the notification channels when the servlet process dies, so it is a BAD CHOICE\nfor a production application. But it is a convenient choice when testing locally, in which case\nyou don't need to override it, and can simply reference it directly in your web.xml file. For\nexample: \n\n\n {@literal \u003c}servlet{@literal\u003e}\n {@literal \u003c}servlet-name{@literal\u003e}NotificationServlet{@literal \u003c} ervlet-name{@literal=\"\"\u003e}\n {@literal \u003c}servlet-class{@literal\u003e}\n com.google.api.client.googleapis.extensions.servlet.notificationsNotificationServlet\n {@literal \u003c} ervlet-class{@literal=\"\"\u003e}\n {@literal \u003c} ervlet{@literal=\"\"\u003e}\n {@literal \u003c}servlet-mapping{@literal\u003e}\n {@literal \u003c}servlet-name{@literal\u003e}NotificationServlet{@literal \u003c} ervlet-name{@literal=\"\"\u003e}\n {@literal \u003c}url-pattern{@literal\u003e}/notifications{@literal \u003c} rl-pattern{@literal=\"\"\u003e}\n {@literal \u003c} ervlet-mapping{@literal=\"\"\u003e}\n \nInheritance\n-----------\n\n[java.lang.Object](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html) \\\u003e jakarta.servlet.GenericServlet \\\u003e jakarta.servlet.http.HttpServlet \\\u003e NotificationServlet \n\nInherited Members\n-----------------\n\njakarta.servlet.GenericServlet.destroy() \njakarta.servlet.GenericServlet.getInitParameter(java.lang.String) \njakarta.servlet.GenericServlet.getInitParameterNames() \njakarta.servlet.GenericServlet.getServletConfig() \njakarta.servlet.GenericServlet.getServletContext() \njakarta.servlet.GenericServlet.getServletInfo() \njakarta.servlet.GenericServlet.getServletName() \njakarta.servlet.GenericServlet.init() \njakarta.servlet.GenericServlet.init(jakarta.servlet.ServletConfig) \njakarta.servlet.GenericServlet.log(java.lang.String) \njakarta.servlet.GenericServlet.log(java.lang.String,java.lang.Throwable) \njakarta.servlet.http.HttpServlet.doDelete(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) \njakarta.servlet.http.HttpServlet.doGet(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) \njakarta.servlet.http.HttpServlet.doHead(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) \njakarta.servlet.http.HttpServlet.doOptions(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) \njakarta.servlet.http.HttpServlet.doPost(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) \njakarta.servlet.http.HttpServlet.doPut(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) \njakarta.servlet.http.HttpServlet.doTrace(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) \njakarta.servlet.http.HttpServlet.getLastModified(jakarta.servlet.http.HttpServletRequest) \njakarta.servlet.http.HttpServlet.service(jakarta.servlet.ServletRequest,jakarta.servlet.ServletResponse) \njakarta.servlet.http.HttpServlet.service(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse) \n[Object.clone()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#clone--) \n[Object.equals(Object)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals-java.lang.Object-) \n[Object.finalize()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#finalize--) \n[Object.getClass()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#getClass--) \n[Object.hashCode()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode--) \n[Object.notify()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#notify--) \n[Object.notifyAll()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#notifyAll--) \n[Object.toString()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#toString--) \n[Object.wait()](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait--) \n[Object.wait(long)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait-long-) \n[Object.wait(long,int)](https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#wait-long-int-)\n\nConstructors\n------------\n\n### NotificationServlet()\n\n public NotificationServlet()\n\nConstructor to be used for testing and demo purposes that uses MemoryDataStoreFactory#getDefaultInstance() which means it will NOT persist the notification\nchannels when the servlet process dies, so it is a bad choice for a production application.\n\n### NotificationServlet(DataStore\\\u003cStoredChannel\\\u003e channelDataStore)\n\n protected NotificationServlet(DataStore\u003cStoredChannel\u003e channelDataStore)\n\nConstructor that allows a specific notification data store to be specified.\n\n### NotificationServlet(DataStoreFactory dataStoreFactory)\n\n protected NotificationServlet(DataStoreFactory dataStoreFactory)\n\nConstructor which uses [StoredChannel#getDefaultDataStore(DataStoreFactory)](/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.notifications.StoredChannel#com_google_api_client_googleapis_notifications_StoredChannel_getDefaultDataStore_com_google_api_client_util_store_DataStoreFactory_) on the given\ndata store factory, which is the normal use case.\n\nMethods\n-------\n\n### doPost(HttpServletRequest req, HttpServletResponse resp)\n\n protected void doPost(HttpServletRequest req, HttpServletResponse resp)\n\n**Overrides** \njakarta.servlet.http.HttpServlet.doPost(jakarta.servlet.http.HttpServletRequest,jakarta.servlet.http.HttpServletResponse)"]]