2016-02-15 8 views
1

Struts 2 имеет неявное преобразование типа, которое принимает заботы о введенных пользователем параметрах типа cast, например. int, string, double, boolean и т. д. Но мое требование состоит в том, чтобы преобразовать содержимое области текстового поля в массив байтов, и для этого я создал класс конвертируемого типа.Ошибка преобразования типа Strust2 из массива String в байты?

public class StringToByteArrayConverter extends StrutsTypeConverter{ 

    @Override 
    public Object convertFromString(Map context, String[] value, Class arg2) { 
     String val = value[0]; 
     return val.getBytes() ; 
    } 

    @Override 
    public String convertToString(Map context, Object value) { 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      ObjectOutputStream os; 
      try { 
       os = new ObjectOutputStream(out); 
       os.writeObject(value); 
       return new String(out.toByteArray()); 
      } catch (IOException e) {   
       e.printStackTrace(); 
       return null;      
      } 
    } 
} 

А в классе модели я указал следующую аннотацию на сеттер имущества

@TypeConversion(converter="org.package.name.StringToByteArrayConverter") 
public void setVarName(byte[] varName) { 
    this.varName = varName; 
} 

То же аннотаций на применены метод получения также. Теперь все кажется прекрасным. Я получаю правильные данные в методе действия. Но пока вы показываете данные на jsp, я получаю дополнительные символы с оригинальным контентом.

например. Пользовательский ввод: как вас зовут? это отображение на jsp: ¬íur [B¬óøTàxpwhat ваше имя?

У любого есть идея, Что я донг ошибаюсь?

+0

Вы храните эту строку где-нибудь? Откуда у вас это получается? –

+0

Мне нужно сохранить его в БД, но прямо сейчас я получаю его от входа в браузер (textarea) и отправляю обратно в браузер. – dpilwal

ответ

1

Start, указав правильный Charset в обработке байтов в строку:

val.getBytes();  // wrong 
val.getBytes("UTF-8"); // right 

при условии, что вы работаете на UTF-8. В противном случае просто поставьте кодировку, которую вы используете, но never использует val.getBytes();, который будет использовать кодировку платформы по умолчанию, которая может отличаться от кодировки вашего приложения, создавая ошибки преобразования и артефакты, подобные тем, которые вы сейчас получаете.

Тогда ObjectOutputStream не убеждает меня. Попробуйте с помощью простого

@Override 
public String convertToString(Map context, Object value) { 
    try {    
     return new String((byte[]) value, "UTF-8"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

и в конечном счете добавить протоколирования неправильного использования, например: if (value instanceof byte[]).. else LOG.warn....

+0

Hi Andrea Ligios, Thansk для быстрого реагирования. Я пробовал с кодировкой UTF-8, но все равно получаю ту же ошибку. – dpilwal

+0

Вы пробовали? –

+0

Да, я пробовал с UTF-8, а также Charset.defaultCharset(), но в обоих случаях вывод такой же :( Что еще я могу проверить, чтобы решить эту проблему, пожалуйста, предложите. – dpilwal