Beta
Thread-safe Webhook App Engine Servlet to receive notifications.
In order to use this servlet you need to register the servlet in your web.xml. You may
optionally extend AppEngineNotificationServlet with custom behavior.
It is a simple wrapper around WebhookUtils#processWebhookNotification(HttpServletRequest, HttpServletResponse,
DataStoreFactory) that uses AppEngineDataStoreFactory#getDefaultInstance(), so you may
alternatively call that method instead from your HttpServlet#doPost with no loss of
functionality. Sample web.xml setup:
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-08-28 UTC."],[],[],null,["# Class AppEngineNotificationServlet (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.appengine.notifications.AppEngineNotificationServlet)\n- [2.8.0](/java/docs/reference/google-api-client/2.8.0/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [2.7.2](/java/docs/reference/google-api-client/2.7.2/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [2.6.0](/java/docs/reference/google-api-client/2.6.0/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [2.5.1](/java/docs/reference/google-api-client/2.5.1/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [2.4.1](/java/docs/reference/google-api-client/2.4.1/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [2.1.2](/java/docs/reference/google-api-client/2.1.2/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [2.0.1](/java/docs/reference/google-api-client/2.0.1/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [1.35.2](/java/docs/reference/google-api-client/1.35.2/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [1.34.1](/java/docs/reference/google-api-client/1.34.1/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet)\n- [1.33.4](/java/docs/reference/google-api-client/1.33.4/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet) \n\n public class AppEngineNotificationServlet extends HttpServlet\n\nBeta \n\nThread-safe Webhook App Engine Servlet to receive notifications.\n\nIn order to use this servlet you need to register the servlet in your web.xml. You may\noptionally extend [AppEngineNotificationServlet](/java/docs/reference/google-api-client/latest/com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet) with custom behavior.\n\nIt is a simple wrapper around WebhookUtils#processWebhookNotification(HttpServletRequest, HttpServletResponse, DataStoreFactory) that uses AppEngineDataStoreFactory#getDefaultInstance(), so you may\nalternatively call that method instead from your HttpServlet#doPost with no loss of\nfunctionality. **Sample web.xml setup:** \n\n\n {@literal \u003c}servlet{@literal\u003e}\n {@literal \u003c}servlet-name{@literal\u003e}AppEngineNotificationServlet{@literal \u003c} ervlet-name{@literal=\"\"\u003e}\n {@literal \u003c}servlet-class{@literal\u003e}com.google.api.client.googleapis.extensions.appengine.notifications.AppEngineNotificationServlet{@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}AppEngineNotificationServlet{@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 javax.servlet.GenericServlet \\\u003e [HttpServlet](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html) \\\u003e AppEngineNotificationServlet \n\nInherited Members\n-----------------\n\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[GenericServlet.destroy()](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#destroy--) \n[GenericServlet.getInitParameter(String)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#getInitParameter-java.lang.String-) \n[GenericServlet.getInitParameterNames()](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#getInitParameterNames--) \n[GenericServlet.getServletConfig()](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#getServletConfig--) \n[GenericServlet.getServletContext()](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#getServletContext--) \n[GenericServlet.getServletInfo()](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#getServletInfo--) \n[GenericServlet.getServletName()](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#getServletName--) \n[GenericServlet.init()](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#init--) \n[GenericServlet.init(ServletConfig)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#init-javax.servlet.ServletConfig-) \n[GenericServlet.log(String)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#log-java.lang.String-) \n[GenericServlet.log(String,Throwable)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/GenericServlet.html#log-java.lang.String-java.lang.Throwable-) \n[HttpServlet.doDelete(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#doDelete-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-) \n[HttpServlet.doGet(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#doGet-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-) \n[HttpServlet.doHead(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#doHead-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-) \n[HttpServlet.doOptions(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#doOptions-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-) \n[HttpServlet.doPost(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#doPost-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-) \n[HttpServlet.doPut(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#doPut-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-) \n[HttpServlet.doTrace(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#doTrace-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-) \n[HttpServlet.getLastModified(HttpServletRequest)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#getLastModified-javax.servlet.http.HttpServletRequest-) \n[HttpServlet.service(ServletRequest,ServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#service-javax.servlet.ServletRequest-javax.servlet.ServletResponse-) \n[HttpServlet.service(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#service-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-)\n\nConstructors\n------------\n\n### AppEngineNotificationServlet()\n\n public AppEngineNotificationServlet()\n\nMethods\n-------\n\n### doPost(HttpServletRequest req, HttpServletResponse resp)\n\n protected void doPost(HttpServletRequest req, HttpServletResponse resp)\n\n**Overrides** \n[HttpServlet.doPost(HttpServletRequest,HttpServletResponse)](https://docs.oracle.com/javase/8/docs/api/javax/servlet/http/HttpServlet.html#doPost-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-)"]]