2010-05-28 22 views
8
Map session = ActionContext.getContext().getSession(); 
session.put("user", user); 

Este código genera una advertencia: Tipo de seguridad: El método puesto (Objeto, Objeto) pertenece al tipo sin formato Mapa. Las referencias al tipo genérico Map < K, V> se deben parametrizar.¿Cómo resolver este tipo de advertencia de seguridad de tipo Java?

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession(); 
session.put("user", user); 

Este código genera una advertencia: seguridad Tipo: Desactivada fundido de un mapa a < cadena, Serializable>.

El método getSession pertenece a Struts2, por lo que no puedo modificarlo. Me gustaría evitar el uso de @SuppressWarnings porque otras advertencias pueden ser útiles.

Supongo que todos los usuarios de Struts2 en el mundo se enfrentan al mismo problema ... ¿existe una solución elegante?

Respuesta

8

No creo que haya ninguna otra manera pero @SuppressWarnings ("sin control"). Creo que puedes ponerlo justo encima de la línea en cuestión, y solo suprimirá esa línea.

Editar: también puedes hacer Map<?, ?> session = ActionContext.getContext().getSession(); pero no estoy seguro de qué tan dispuesto estás a hacer eso; no podrá poner nada en el mapa de esa manera (ya que el compilador no puede verificar el tipo de lo que está poniendo), solo lea de él.

0

¿Y si lo haces de esta manera:

Map<String, Serializable> session = ActionContext.getContext().getSession(); 
+0

Se da otra advertencia: la seguridad Tipo: La expresión de tipo Mapa necesidades de conversión sin control para ajustarse al mapa < Cadena, Serializable> –

1

¿Qué versión de Struts 2 (especialmente XWork) estás usando? Para mí, el siguiente código da un error:

Map<String, Serializable> session = (Map<String, Serializable>)ActionContext.getContext().getSession(); 
session.put("user", user); 

Cannot cast from Map<String,Object> to Map<String,Serializable>. 

Esto, por otra parte, funciona y da ninguna advertencia:

Map<String, Object> session = ActionContext.getContext().getSession(); 
+0

¿No es así? Recibo una advertencia (¿o fue un error?) Si no lanzo ... – helios

+0

Uso 2.1.8.1 que es la última versión. Su sugerencia proporciona esta advertencia: Tipo de seguridad: la expresión de tipo Mapa necesita una conversión sin marcar para ajustarse a Map

+1

http://struts.apache.org/2.1.8.1/struts2-core/apidocs/com/opensymphony /xwork2/ActionContext.html Parece que el 2.1.8.1 getSession debería devolver un mapa parametrizado. ¿Estás seguro de que está instalado correctamente y que no usa una versión anterior instalada previamente? –

3

La forma más segura, más eficiente para hacer frente a esto es probablemente:

Map<?, ?> session = ActionContext.getContext().getSession(); 

y escriba emitir los objetos recuperados del mapa de sesión.

El enfoque @SuppressWarnings realmente dará como resultado un código compilado que es idéntico. Sin embargo, el tipo de molde será implícito; es decir, no será fácil de detectar mirando el código fuente. Y la anotación @SuppressWarnings podría (hipotéticamente) suprimir un poco de otra advertencia en el mismo bloque de código que representa un error real; es decir, uno que dará como resultado uno de los tipos de letra ocultos, etc. fallando en tiempo de ejecución.

Otras alternativas más caras incluyen:

  • una entrada por copia entrada de la Map<?, ?> a un nuevo Map<String, Serializable> ejemplo fundición las claves y valores a String y Serializable respectivamente, o

  • un método genérico como el siguiente que realiza el encasillado de forma segura.


@SuppressWarnings("unchecked") 
public <K,V> Map<K,V> castMap(Map<?, ?> map, Class<K> kClass, Class<V> vClass) { 
    for (Map.Entry<?, ?> entry : map.entrySet()) { 
     kClass.cast(entry.getKey()); 
     vClass.cast(entry.getValue()); 
    } 
    return (Map<K,V>) map; 
} 
0

Se está solicitando que parametrizar el valor, si el valor necesita parámetros luego se pasa.

Por ejemplo

Map<Integer, Map> vCombinedCodeMap = new HashMap<>(); 

incluirá un aviso de "parametrizado" Map<Integer, Map>.

por lo que el formato correcto es el siguiente:

Map<Integer, Map<String, String>> vCombinedCodeMap = new HashMap<>(); 
0

moldeada de la siguiente manera,

public void setSession(Map<String, Object> sessionMap) { 

    // TODO Auto-generated method stub 

    this.sessionMap = (SessionMap<String, Object>) sessionMap; 
} 
Cuestiones relacionadas