7

Android uygulamasında GCM'yi (Google bulut mesajlaşma) kullanmaya çalışıyorum. Bunun için this tutorial'u takip ediyorum. Aşağıdaki yorumlar, başarı bildirir, bu yüzden sorun kesinlikle benim tarafımda değil, öğreticidir.java.lang.IllegalArgumentException: Servlet eşlemesi bilinmeyen bir sunucu adını belirtir GCMBroadcast

Bilgi- Java EE için en son Eclipse koşuyorum Tomcat sürüm 8

Bu erkek kedi sunucusu çalıştırmak için çalışıyor konsol hatadır (son): Burada

Caused by: java.lang.IllegalArgumentException: Servlet mapping specifies an unknown servlet name GCMBroadcast 
     at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3071) 
     at org.apache.catalina.core.StandardContext.addServletMapping(StandardContext.java:3050) 
     at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1372) 
     at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1176) 
     at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:771) 
     at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:305) 
     at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117) 
     at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
     at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5066) 
     at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
     ... 6 more 

olduğunu benim proje hiyerarşisi tam olarak nasıl olması gerektiğidir.

Benim web.xml kodu:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" 
    version="3.0"> 
    <servlet> 
     <servlet-name>com.avilyne.gcm.GCMBroadcast</servlet-name> 
     <servlet-class>com.avilyne.gcm.GCMBroadcast</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>GCMBroadcast</servlet-name> 
     <url-pattern>/gcmbroadcast</url-pattern> 
    </servlet-mapping> 
    <welcome-file-list> 
     <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

</web-app> 

Benim index.jsp dosyası:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<% 
    // retrieve our passed CollapseKey and Message parameters, if they exist. 
    String collapseKey = "GCM_Message"; 
    String message = "Generic Broadcast Message"; 

    Object collapseKeyObj = request.getAttribute("CollapseKey"); 

    if (collapseKeyObj != null) { 
     collapseKey = collapseKeyObj.toString(); 
    } 

    Object msgObj = request.getAttribute("Message"); 

    if (msgObj != null) { 
     message = msgObj.toString(); 
    } 

%> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
<title>Android GCM Broadcast</title> 

</head> 
<body> 

    <h2>GCM Broadcast Demo</h2> 

    <form action="GCMBroadcast" method="post"> 
     <label>Broadcast Message </label> 
     <br /><input type="text" name="CollapseKey" value="<%=collapseKey %>" /> 
     <br/><textarea name="Message" rows="3" cols="60" ><%=message %> </textarea> 
     <br/><input type="submit" name="submit" value="Submit" /> 
     </form> 
    </body> 
</html> 

My GCMBroadcast.java dosyası (ben paylaşılacak gerekli olmadığını düşünüyorum ancak herhangi almıyorum şansı): Ben 8. kullanıyorum ederken adam bence bu pr olması gerektiğini sanmıyorum Tomcat 7 kullanıyor eğitimde

package com.avilyne.gcm; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.*; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import com.google.android.gcm.server.Message; 
import com.google.android.gcm.server.MulticastResult; 
import com.google.android.gcm.server.Sender; 

/** 
* Servlet implementation class GCMBroadcast 
*/ 
@WebServlet("/GCMBroadcast") 
public class GCMBroadcast extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    // The SENDER_ID here is the "Browser Key" that was generated when I 
    // created the API keys for my Google APIs project. 
    private static final String SENDER_ID = "AIzaSyCWryYfPDw3Ge7oMvI2vSeRKoFvsc7yasd"; 

    // This is a *cheat* It is a hard-coded registration ID from an Android device 
    // that registered itself with GCM using the same project id shown above. 
    private static final String DROID_BIONIC = "APA91bEju-eB74DWRChlVt5gh7YfIVzNOr8gRYPisFbmcwBPlMJeGTYmdF7cYR3oL-F9KqmTey016drxmWAkYa4WQv9pQ_KvRzI1VUkql6ObbYGPkV7UBsm6pYoBw0dEk3veh60v3lVhDtLztWIbDc3XqtjU_fE_0g"; 

    // This array will hold all the registration ids used to broadcast a message. 
    // for this demo, it will only have the DROID_BIONIC id that was captured 
    // when we ran the Android client app through Eclipse. 
    private List<String> androidTargets = new ArrayList<String>(); 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public GCMBroadcast() { 

     super(); 

     // we'll only add the hard-coded *cheat* target device registration id 
     // for this demo. 
     androidTargets.add(DROID_BIONIC); 

    } 

    // This doPost() method is called from the form in our index.jsp file. 
    // It will broadcast the passed "Message" value. 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

     // We'll collect the "CollapseKey" and "Message" values from our JSP page 
     String collapseKey = ""; 
     String userMessage = ""; 

     try { 
      userMessage = request.getParameter("Message"); 
      collapseKey = request.getParameter("CollapseKey"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return; 
     } 

     // Instance of com.android.gcm.server.Sender, that does the 
     // transmission of a Message to the Google Cloud Messaging service. 
     Sender sender = new Sender(SENDER_ID); 

     // This Message object will hold the data that is being transmitted 
     // to the Android client devices. For this demo, it is a simple text 
     // string, but could certainly be a JSON object. 
     Message message = new Message.Builder() 

     // If multiple messages are sent using the same .collapseKey() 
     // the android target device, if it was offline during earlier message 
     // transmissions, will only receive the latest message for that key when 
     // it goes back on-line. 
     .collapseKey(collapseKey) 
     .timeToLive(30) 
     .delayWhileIdle(true) 
     .addData("message", userMessage) 
     .build(); 

     try { 
      // use this for multicast messages. The second parameter 
      // of sender.send() will need to be an array of register ids. 
      MulticastResult result = sender.send(message, androidTargets, 1); 

      if (result.getResults() != null) { 
       int canonicalRegId = result.getCanonicalIds(); 
       if (canonicalRegId != 0) { 

       } 
      } else { 
       int error = result.getFailure(); 
       System.out.println("Broadcast failure: " + error); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // We'll pass the CollapseKey and Message values back to index.jsp, only so 
     // we can display it in our form again. 
     request.setAttribute("CollapseKey", collapseKey); 
     request.setAttribute("Message", userMessage); 

     request.getRequestDispatcher("index.jsp").forward(request, response); 

    } 

} 

oblem. Bu, sanırım anlatmaya ihtiyacım var. Bu sorunu sıralamak gerçekten, gerçekten, gerçekten yararlı olacaktır. Ittifakınız için şimdiye kadar çok teşekkür ederim :)

+0

Sabit! @JFPicard'a teşekkürler. –

cevap

4

Servlet isminiz eşleşmiyor. Servlet ve servlet eşleme etiketindeki sunucu adı aynı olmalıdır. Hata mesajı açık: java.lang.IllegalArgumentException: Neden Olduğu

Servlet haritalama bilinmeyen bir servlet adı

GCMBroadcast belirten

Dene:

<servlet> 
     <servlet-name>GCMBroadcast</servlet-name> 
     <servlet-class>com.avilyne.gcm.GCMBroadcast</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>GCMBroadcast</servlet-name> 
     <url-pattern>/gcmbroadcast</url-pattern> 
    </servlet-mapping> 
+0

OMG evet, teşekkür ederim! Tüm paket adını eklememiz gerektiğini söyleyen bir rehbere göre ilk sunucu adını değiştirmek zorunda kaldım, ancak ikinci düğümünde değiştirmem gerektiğini bilmiyordum! –

+0

Hala bana yardım edebilir misiniz? Sunucu çalışıyor ve çalışıyor, http: // localhost: 8080/GCMService/link adresini ziyaret edebilirim (ancak http: // localhost: 8080'i ziyaret etmeye çalışırken 404 hatası veriyor). Yine yayınlamak için Submit'e tıklarsam, bana 404 hatası verir. Ne yapabilirim? Her iki hata da yalnızca tarayıcıda görünür. –

+0

Belki başka bir soru gönderin – JFPicard

İlgili konular