struts2 обрезать всю строку, полученную из форм - PullRequest
6 голосов
/ 23 марта 2010

Я разрабатываю веб-приложение, используя Struts2. Я хочу улучшить получение строки из форм. Для этого нужно обрезать всю строку, и если полученная строка пуста, установить null в поле.

Для этого я создал 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;
    }
}

Затем я добавил строку в xwork-conversion.properties

java.lang.String=com.mypackage.StringConverter

Вот и все. Но я не получил желаемого результата.


Метод convertToString () вызывается при создании формы jsp, но метод convertFromString () не вызывается.

Что я делаю не так? Как я могу получить то же самое поведение другим способом?

Пожалуйста, не предлагайте такие решения, как:

  1. удалить значение таких элементов формы, используя javascript.
  2. создать метод util, который сделает это с помощью отражения. Затем вызовите его для каждого компонента формы.

Спасибо заранее, Алексей.

Ответы [ 4 ]

5 голосов
/ 08 сентября 2010

Ответ вы найдете в коде класса StrutsTypeConverter.По сути, на этом уровне среда преобразования типов не знает что-либо о том, поступают ли данные "от" или "к" пользователю, она просто знает, что преобразовывает один тип (String) в другой тип(также Строка).И поскольку он сначала проверяет тип «to», он будет всегда вызывать convertToString.

Короче говоря, текущая версия Struts (2.1.x - это то, что яиспользование) не поддерживает и не может поддерживать преобразователи типа String-to-String .Поскольку это, в конце концов, конвертеры типа , вы, вероятно, можете сказать, что это сделано специально.

Я также ищу способ достижения аналогичного результата, но не нашелдействительно хорошее решение пока.Вероятно, наиболее «правильным» подходом было бы написать перехватчик (как упоминалось в @leonbloy).Было бы несколько способов приблизиться к этому, самый простой из которых - обрезать все параметры запроса до того, как они будут установлены в действии (то есть до того, как перехватчик «params» выполнится).

3 голосов
/ 25 марта 2010

мне кажется правильным.Вы уверены, что convertFromString даже не вызывается?

Другой подход, который вы можете попробовать, - написать Interceptor, который обрезает все параметры (часто это требуется).

1 голос
/ 23 марта 2010

Я не использую Struts2, но подобная проблема проявлялась в JSF до версии 1.2 в 2006 году (JSF - это инфраструктура Sun MVC, конкурент Struts2). Преобразование в String было невозможно в JSF также «по замыслу». Старые версии JSF использовались для проверки того, равен ли целевой тип java.lang.String, а затем он просто устанавливает значение параметра запроса в модели, не пытаясь преобразовать его (поскольку значение параметра запроса уже получено как String). Если тип цели был другим, он найдет и запустит любой связанный конвертер, чтобы преобразовать его в нужный тип цели (отличный от String). Начиная с JSF 1.2 они исправили это, сняв проверку типа цели и определив местонахождение конвертера.

Я не удивлюсь, если подобная функция / ошибка будет существовать в Struts2. Я бы посмотрел на их домашнюю страницу, если об этом еще нет сообщений об ошибках / ошибках, и в противном случае выложу их.

0 голосов
/ 31 августа 2013

По ссылке с этого блога , я внес небольшую модификацию в код, и она отлично работает.Это не утилита, связанная со стойками, но вы можете достичь своей потребности.

Вот класс утилит:

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;
        }
    }

}

Чтобы попробовать:

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());
    }
}

И дает этовывод:

       last name              
        address         
null
last name
address
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...