1

Struts 2 には、 int 、 string 、 double 、 boolean などのユーザーが入力したパラメーター型キャストを処理する暗黙的な型変換があります。しかし、私の要件は、リッチ テキスト領域の入力をバイト配列に変換することであり、そのためにカスタム型コンバーター クラスを作成しました。

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

getter メソッドにも同じアノテーションが適用されます。今はすべて問題ないようです。Action メソッドで正しいデータを取得しています。しかし、jsp でデータを表示しているときに、元のコンテンツで余分なシンボルを取得しています。

例えば。ユーザー入力: あなたの名前は? それは jsp に表示されます: ¬íur[B¬óøTàxpあなたの名前は何ですか?

誰もが何か考えを持っています、私は何を間違っていますか?

4

1 に答える 1

1

バイトから文字列への処理で正しい Charset を指定することから始めます。

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

あなたがUTF-8で作業していると仮定します。それ以外の場合は、使用している文字セットをそのまま配置しますが、アプリの文字セットとは異なる可能性があるプラットフォームの既定の文字セットを使用しないでください。変換エラーや、現在取得しているようなアーティファクトが作成されます。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...

于 2016-02-15T10:04:52.587 に答える