2016-03-22 11 views
0

私のアプリケーションはXSDファイルに基づいてXMLを検証します。この検証の結果、エラーメッセージが表示されます。これをユーザーに表示するために、java.text.MessageFormatを使用してこのエラーメッセージを解析します。 問題がある:メッセージが英語に来るとき、私は通常、それを解析することができるよ、そのメッセージはポルトガル語(ブラジル)に来るときには、以下のエラーが返されます。ここでは英語以外のメッセージを解析するときのMessageFormat解析エラー

java.text.ParseException: MessageFormat parse error! 
    at java.text.MessageFormat.parse(MessageFormat.java:1035) 
    at com.local.messageformat.MessageFormatMain.splitMessage(MessageFormatMain.java:34) 
    at com.local.messageformat.MessageFormatMain.start(MessageFormatMain.java:20) 
    at com.local.messageformat.MessageFormatMain.main(MessageFormatMain.java:14) 

は私のコードです:

public class MessageFormatMain { 

public static void main(String[] args) { 
    final MessageFormatMain main = new MessageFormatMain(); 
    main.start(); 
} 

private void start() { 
    final String errorMessageKey = "cvc-complex-type.2.4.a"; 
//Portuguese message (shows error) 
    final String errorMessage = "cvc-complex-type.2.4.a: Conteúdo inválido encontrado a partir do elemento 'inscricaomunicipaltomador'. Um de '{razaosocialtomador, estrangeirotomador, tipologradourotomador, logradourotomador, numeroenderecotomador, bairrotomador, complementotomador, cidadetomadordescricao, estadotomadordescricao, fonetomador, ceptomador, emailtomador, tomadorpais, tomadorresptribut, codigoatividade, aliquotaatividade, tiporecolhimento, valortotalrps, valorservicosrps, valoriss, valorpis, valorcofins, valorinss, valorir, valorcsll, aliquotapis, aliquotacofins, aliquotainss, aliquotair, aliquotacsll, descricaorps, tributacaorps, localservico, itens}' é esperado."; 
// English message (works fine) 
// final String errorMessage = "cvc-complex-type.2.4.a: Invalid content was found starting with element 'inscricaomunicipaltomador'. One of '{razaosocialtomador, estrangeirotomador, tipologradourotomador, logradourotomador, numeroenderecotomador, bairrotomador, complementotomador, cidadetomadordescricao, estadotomadordescricao, fonetomador, ceptomador, emailtomador, tomadorpais, tomadorresptribut, codigoatividade, aliquotaatividade, tiporecolhimento, valortotalrps, valorservicosrps, valoriss, valorpis, valorcofins, valorinss, valorir, valorcsll, aliquotapis, aliquotacofins, aliquotainss, aliquotair, aliquotacsll, descricaorps, tributacaorps, localservico, itens}' is expected."; 
    Object[] ret = splitMessage(errorMessage, errorMessageKey); 
    if (ret.length > 0) { 
     System.out.println(ret[0]); 
     System.out.println(ret[1]); 
    } 
} 

private Object[] splitMessage(final String errorMessage, final String errorMessageKey) { 
    final ResourceBundle resourceBundle = PropertyResourceBundle.getBundle("com.sun.org.apache.xerces.internal.impl.msg.XMLSchemaMessages", Locale.ROOT); 
    if (errorMessageKey != null && !errorMessageKey.isEmpty() && resourceBundle.containsKey(errorMessageKey)) { 
     final String errorMessagePattern = resourceBundle.getString(errorMessageKey); 
     final MessageFormat messageFormat = new MessageFormat(errorMessagePattern); 
     Object arguments[]; 
     try { 
      arguments = messageFormat.parse(errorMessage); 
      return arguments; 
     } catch (final ParseException e) { 
      e.printStackTrace(); 
     } 
     return new Object[0]; 
    } 
    return new Object[0]; 
} 

}

私はドのResourceBundleを取得するためにものMessageFormatをインスタンス化するために別の場所を指定しようとしたが、それらの非が働いていました。

ありがとうございます。

ギリェルメ

答えて

0

私はこの問題の解決方法を考え出しました。最初の瞬間に 私はウィッヒは、次のパッケージを使用して、XercesImpl libにを使用してXMLファイルのXSDスキーマ検証を行います。

org.apache.xerces.impl.msg.XMLSchemaMessages 

は、まずロードされたメッセージは英語でだったが、このLIBの更新後読み込まれたメッセージはポルトガル語です。 SplitMessageメソッドが呼び出されたとき、私はXercesImplパッケージの代わりにJavaパッケージを参照していました。 明らかに、MessageFormat.parseは英語メッセージ(Javaパッケージから抽出)を使用してポルトガル語のメッセージ(XercesImplから抽出)を解析できませんでした。

これを解決するためにsplitMessageメソッドを単純に変更しました。このように:私はメインの方法で「PT/BR」とロケールを設定

final ResourceBundle resourceBundle = ResourceBundle.getBundle("org.apache.xerces.impl.msg.XMLSchemaMessages"); 

覚えて、それは私がリソースをロードするためにロケールを設定する必要はありません理由です。

私が使用しているJDKには、ポルトガル語のスキーマメッセージファイルがあります。とにかくうまくいったはずです。

0

私は、あなたが検索しているressourceBundleはポルトガル語で翻訳されていないと思います。

私はフランス語でそれを書き直してみました、私のフランス語のJVM上でそれをテスト:)、それが動作します:

final String errorMessage = "cvc-complex-type.2.4.a : Contenu non valide trouvé à partir de l'élément 'inscricaomunicipaltomador'. L'une des valeurs '{razaosocialtomador, estrangeirotomador, tipologradourotomador, logradourotomador, numeroenderecotomador, bairrotomador, complementotomador, cidadetomadordescricao, estadotomadordescricao, fonetomador, ceptomador, emailtomador, tomadorpais, tomadorresptribut, codigoatividade, aliquotaatividade, tiporecolhimento, valortotalrps, valorservicosrps, valoriss, valorpis, valorcofins, valorinss, valorir, valorcsll, aliquotapis, aliquotacofins, aliquotainss, aliquotair, aliquotacsll, descricaorps, tributacaorps, localservico, itens}' est attendue."; 

おそらく、あなたは「XMLSchemaMessages_pr名前を付ける必要がありressourceBundleのポルトガル語版を見つけるために試みることができます.properties "を入力し、クラスパスに追加します(this post)。