2012-02-28 27 views
6

Recibo un error en las siguientes líneas.¿Cómo resolver este tipos incompatibles en Java?

error: incompatible types 
required : java.util.Map.entry<java.lang.String,java.lang.String[]> 
found :java.lang.Object   

código completo está por debajo

package com.auth.actions; 

public class SocialAuthSuccessAction extends Action { 

    final Log LOG = LogFactory.getLog(SocialAuthSuccessAction.class); 

    @Override 
    public ActionForward execute(final ActionMapping mapping, 
      final ActionForm form, final HttpServletRequest request, 
      final HttpServletResponse response) throws Exception { 

     AuthForm authForm = (AuthForm) form; 
     SocialAuthManager manager = null; 
     if (authForm.getSocialAuthManager() != null) { 
      manager = authForm.getSocialAuthManager(); 
     } 
     if (manager != null) { 
      List<Contact> contactsList = new ArrayList<Contact>(); 
      Profile profile = null; 
      try { 
       Map<String, String> paramsMap = new HashMap<String, String>(); 
       for (Map.Entry<String, String[]> entry :request.getParameterMap().entrySet()) { // error in this line! 
        String key = entry.getKey(); 
        String values[] = entry.getValue(); 
        paramsMap.put(key, values[0].toString()); // Only 1 value is 
       } 
       AuthProvider provider = manager.connect(paramsMap); 

       profile = provider.getUserProfile(); 
       contactsList = provider.getContactList(); 
       if (contactsList != null && contactsList.size() > 0) { 
        for (Contact p : contactsList) { 
         if (StringUtils.isEmpty(p.getFirstName()) 
           && StringUtils.isEmpty(p.getLastName())) { 
          p.setFirstName(p.getDisplayName()); 
         } 
        } 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      request.setAttribute("profile", profile); 
      request.setAttribute("contacts", contactsList); 

      return mapping.findForward("success"); 
     } 
     // if provider null 
     return mapping.findForward("failure"); 
    } 
} 

Por favor, ayuda

+1

lo request.getParameterMap() devuelve? – mini

+0

Esa línea se ve bien, ¿puedes publicar el seguimiento de la pila real? – DNA

+0

'getParameterMap()' se define [aquí] (http://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameterMap%28%29) – DNA

Respuesta

11

Es necesario para echar a request.getParameterMap()Map<String, String[]>

for (Map.Entry<String, String[]> entry : 
    ((Map<String, String[]>)request.getParameterMap()).entrySet()) 
+1

Podría explicar por qué se necesita el yeso? 'getParameter()' da un 'Map ', así 'entrySet()' da un 'Set >', que permite iterar con un 'Map.Entry < String, String []> '. Todo parece estar bien sin lanzar. –

+2

Probablemente esté trabajando con JEE 5 y no con JEE6. En JEE5, getParameterMap() está sin tipo, lo que significa que obtienes un Map . Vea aquí http://docs.oracle.com/javaee/5/api/javax/servlet/ServletRequest.html –

5

Pruebe lo siguiente:

for (Object obj :request.getParameterMap().entrySet()) { 
       Map.Entry<String, String[]> entry = (Map.Entry<String, String[]>) obj; 
       String key = entry.getKey(); 
       String values[] = entry.getValue(); 
       paramsMap.put(key, values[0].toString()); // Only 1 value is 
      } 

No estoy seguro de que esto funcione, de todos modos, tienes el enfoque. Espero que esto ayude.

2

Como pointed out en los comentarios, getParameterMap() debe devolver el tipo sin procesar Map en lugar de Map<String, String[]>. Esto significa getParameterMap().entrySet() devuelve raw Iterable, causando el error del compilador.

Si desea evitar hacer un reparto sin control explícito como las otras respuestas sugieren, una alternativa es usar una asignación de variables para la conversión sin control:

@SuppressWarnings("unchecked") // getParameterMap returns raw Map 
Map<String, String[]> params = request.getParameterMap(); 
for (Map.Entry<String, String[]> entry : params.entrySet()) { 
    ... 
} 
Cuestiones relacionadas