2010-03-23 15 views
6

Desarrollo de aplicaciones web utilizando struts2. Quiero mejorar la obtención de cadenas de formularios. Para esta necesidad recorte toda la cadena y si la cadena obtenida está vacía, configure nulo en el campo.struts2 recortar todas las cadenas obtenidas de los formularios

Para esto, creé StringConverter.

public class StringConverter extends StrutsTypeConverter { 

    @Override 
    public Object convertFromString(Map context, String[] strings, Class toClass) { 
     if (strings == null || strings.length == 0) { 
      return null; 
     } 

     String result = strings[0]; 
     if (result == null) { 
      return null; 
     } 

     result = result.trim(); 
     if (result.isEmpty()) { 
      return null; 
     } 
     return result; 
    } 

    @Override 
    public String convertToString(Map context, Object object) { 
     if (object != null && object instanceof String) { 
      return object.toString(); 
     } 
     return null; 
    } 
} 

A continuación, añadió fila para xwork-conversion.properties

java.lang.String=com.mypackage.StringConverter 

Eso es todo. Pero no obtuve el resultado deseado.

método

ConvertToString() se llama cuando JSP construir la forma, pero convertFromString() no invoca.

¿Qué hago mal? ¿Cómo puedo obtener el mismo comportamiento usando otra forma?

Por favor, no ofrece soluciones tales como:

  1. quitar el valor de dichos elementos de formulario mediante JavaScript.
  2. crear el método util que lo hará usando la reflexión. Luego llámalo para cada forma de frijol.

Gracias de antemano, Alexey.

+1

Lo mismo que me está pasando. –

Respuesta

1

No hago Struts2, pero el problema similar se ha manifestado en JSF hasta la versión 1.2 en 2006 (JSF es el framework MVC de Sun, el competidor de Struts2). La conversión a String también fue imposible en JSF "por diseño". Las versiones anteriores de JSF se utilizan para comprobar si el tipo de destino es igual a java.lang.String y luego simplemente establece el valor del parámetro de solicitud en el modelo sin intentar convertirlo (porque el valor del parámetro de solicitud ya se obtuvo como String). Si el tipo de destino ha sido diferente, localizará y ejecutará cualquier convertidor asociado para convertirlo al tipo de destino deseado (que no sea String). Desde JSF 1.2 lo arreglaron quitando la verificación del tipo de destino y ubicando el convertidor de cualquier manera.

No me sorprenderá si existe una característica/error similar en Struts2. Me gustaría mirar su página de inicio si no hay un informe de problema/error al respecto y, de lo contrario, publicar uno.

3

Me parece correcto. ¿Estás seguro de que ni siquiera se llama a convertFromString?

Otro enfoque que puede intentar es escribir un Interceptor que recorta todos los parámetros (uno frecuentemente lo quiere).

5

Encontrará la respuesta en el código de la clase StrutsTypeConverter. Básicamente, en este nivel, el marco del convertidor de tipos no sabe si los datos vienen "de" o "a" el usuario, simplemente sabe que está convirtiendo de un tipo (Cadena) a otro tipo (también Cadena) . Y dado que primero verifica el tipo "a", siempre llama a convertToString.

Para abreviar, la versión actual de Struts (2.1.x es lo que estoy usando) no admite y no puede admitir los convertidores de tipo String-to-String.Dado que, después de todo, son convertidores tipo, probablemente pueda decir que esto es por diseño.

También estoy buscando una manera de lograr un resultado similar, pero todavía no he encontrado una solución realmente buena. Probablemente el enfoque más "correcto" sería escribir un interceptor (como se menciona en @leonbloy). Habría varias formas de abordar esto, el más sencillo sería recortar todos los parámetros de solicitud antes de que se establezcan en la acción (es decir, antes de que se ejecute el interceptor "params").

+0

¿qué tal esta solución? http://stackoverflow.com/a/12989407/369587 – webdevbyjoss

0

Referido de this blog, hice una pequeña modificación en el código y funciona bien. Esta no es una utilidad relacionada con struts, pero puede lograr su necesidad.

Aquí es la clase de utilidad:

package com.company.project.common.helpers; 

import java.io.Serializable; 
import java.lang.reflect.InvocationTargetException; 
import java.lang.reflect.Method; 

/** 
* 
* <b>File Name :</b> <i>BeanUtils.java</i> <br> 
* <b>Description :</b> 
* <p> 
* This class contains the activities of skill program. <br/> 
* <br/> 
* <b>Copyright :</b> Copyright© yyyy description 
* </p> 
* <h1>Version History :</h1> 
* 
* Date : 20-06-2013<br/> 
* Description : First Draft 
* 
* @version 1.0.0.1 
* @since 1.0.0.0.1 
* @author visruth 
* 
*/ 
public class BeanUtils implements Serializable { 

    /** 
    * This method trims all String variables defined in the bean if they have 
    * corresponding getter setter methods. <br/> 
    * Eg : BeanUtils beanUtils=new BeanUtils();<br/> 
    * StudentVO studentVO=new StudentVO();<br/> 
    * studentVO.setName(" foo ");<br/> 
    * studentVO.setAddress(" bar ");<br/> 
    * beanUtils.trimAllStrings(studentVO);<br/> 
    * System.out.println(studentVO.getName());//prints foo<br/> 
    * System.out.println(studentVO.getAddress());//prints bar<br/> 
    * 
    * @param beanObject 
    * @throws Exception 
    *    If a variable has its getter method defined but not setter 
    *    method will throw NoSuchMethodException instance as 
    *    Exception. 
    * @author visruth 
    */ 
    public void trimAllStrings(Object beanObject) throws Exception { 
     Exception noSuchMethodException = null; 
     boolean throwNoSuchMethodException = false; 
     if (beanObject != null) { 

      Method[] methods = null; 

      try { 
       methods = beanObject.getClass().getMethods(); 
      } catch (SecurityException e) { 
       throw new Exception(e); 
      } 

      if (methods != null) { 

       for (Method method : methods) { 

        String methodName = method.getName(); 

        if (!methodName.equals("getClass")) { 

         String returnType = method.getReturnType().toString(); 
         String commonMethodName = null; 

         if (methodName.startsWith("get") 
           && "class java.lang.String".equals(returnType)) { 

          commonMethodName = methodName.replaceFirst("get", 
            ""); 
          String returnedValue = null; 

          try { 
           returnedValue = (String) method 
             .invoke(beanObject); 
          } catch (IllegalArgumentException e) { 
           e.printStackTrace(); 
           throw e; 
          } catch (IllegalAccessException e) { 
           e.printStackTrace(); 
           throw e; 
          } catch (InvocationTargetException e) { 
           e.printStackTrace(); 
           throw e; 
          } 

          if (returnedValue != null) { 

           StringBuilder setterMethodName = new StringBuilder(); 
           setterMethodName.append("set"); 
           setterMethodName.append(commonMethodName); 
           Method setterMethod = null; 

           try { 
            setterMethod = beanObject 
              .getClass() 
              .getMethod(
                setterMethodName.toString(), 
                String.class); 
            if (setterMethod != null) { 
             if(returnedValue.isEmpty()) { 
              Object o=null; 
              setterMethod.invoke(beanObject, o); 
             } else { 
              setterMethod.invoke(beanObject, 
                (returnedValue.trim()));  
             }          
            } 
           } catch (SecurityException e) { 
            e.printStackTrace(); 
            throw e; 
           } catch (NoSuchMethodException e) { 
            e.printStackTrace(); 
            if (!throwNoSuchMethodException) { 
             noSuchMethodException = e; 
            } 
            throwNoSuchMethodException = true; 
           } catch (IllegalArgumentException e) { 
            e.printStackTrace(); 
            throw e; 
           } catch (IllegalAccessException e) { 
            e.printStackTrace(); 
            throw e; 
           } catch (InvocationTargetException e) { 
            e.printStackTrace(); 
            throw e; 
           } 
          } 
         } 
        } 
       } 
      } 
     } 

     if (throwNoSuchMethodException && noSuchMethodException != null) { 
      throw noSuchMethodException; 
     } 
    } 

} 

intentar:

package com.company.project.common.valueobject; 

import java.io.Serializable; 

import com.company.project.common.helpers.BeanUtils; 

public class DetailsVO implements Serializable { 

    private static final long serialVersionUID = 6378955155265367593L; 
    private String firstName; 
    private String lastName; 
    private String address; 
    private double latitude; 
    private double longitude; 

    public String getFirstName() { 
     return firstName; 
    } 

    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    public String getLastName() { 
     return lastName; 
    } 

    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    public String getAddress() { 
     return address; 
    } 

    public void setAddress(String address) { 
     this.address = address; 
    } 

    public double getLatitude() { 
     return latitude; 
    } 

    public void setLatitude(double latitude) { 
     this.latitude = latitude; 
    } 

    public double getLongitude() { 
     return longitude; 
    } 

    public void setLongitude(double longitude) { 
     this.longitude = longitude; 
    } 

    public static void main(String[] args) { 
     BeanUtils beanUtils = new BeanUtils(); 

     DetailsVO profileVO = new DetailsVO(); 

     profileVO.setFirstName(""); 
     profileVO.setLastName("  last name    "); 
     profileVO.setAddress("  address   "); 

     System.out.println(profileVO.getFirstName()); 
     System.out.println(profileVO.getLastName()); 
     System.out.println(profileVO.getAddress()); 

     try { 
      beanUtils.trimAllStrings(profileVO); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     System.out.println(profileVO.getFirstName()); 
     System.out.println(profileVO.getLastName()); 
     System.out.println(profileVO.getAddress()); 
    } 
} 

y da este resultado:

 last name    
     address   
null 
last name 
address 
Cuestiones relacionadas