1

私は Web サービスを開発しています。何があっても、応答は常に有効でなければなりません。つまり、有効な形式で有効であることを意味します。

つまり、Web サービスが特定の XSD スキーマに一致する XML を返すことが期待される場合は、何があっても常に有効な XML ドキュメントを返す必要があります。

私がこれまでに持っている唯一のアプローチは、このようなことをすることです(コントローラーレベルで)

String xmlResponse = this.loadDefaultXML();
try {
     xmlResponse = this.myCoolService.myCoolMethod();
} catch (Throwable t) {
     xmlResponse = this.loadDefaultXML(String errorMessage)
} finally {
     return xmlResponse
}

もちろんlpoadDefaultXML()、次のようなxmlドキュメントをロードします。

<?xml>
<result>Ouch, there was a problem</result>

そしてloadDefaultXML(String errorMessage)やります

<?xml>
<result>WHATEVER errorMessage contains</result>

もちろん、サービス レベルは通常の例外を処理しますが、それでも、常に XML を返すことができるように制御できるようにするには、例外をキャッチThrowableして使用することが唯一の方法だと思います。try-catch-finally

より良いアイデアや提案はありますか?

アップデート:

XMLのマーシャリング/アンマーシャリングにSpring MVC 3.2とJAXBを使用しています。これはSOAPを使用しますが、これにはwsdlを使用していません。

4

1 に答える 1

2

Spring MVCでは、リクエストの処理中に例外がスローさDispatcherServletれると、 は構成された を参照してorg.springframework.web.servlet.HandlerExceptionResolver、スローされた例外を処理します。その後、リゾルバーは例外をビューに変換してユーザーに表示できます。

それを使用するには、要するに、次のいずれかを実行できます。

  • HandlerExceptionResolverインターフェイスを実装します。これは、resolveException(Exception, Handler)メソッドを実装して を返すだけの問題ですModelAndView

または、私が好むもの:

  • コントローラー内でメソッドアノテーションを使用して@ExceptionHandler、コントローラーメソッドの実行中に特定のタイプの例外がスローされたときに呼び出されるメソッドを指定します。例えば:

    @Controller
    public class PersonController {
    
        @RequestMapping("person/{id}")
        @ResponseBody
        public Person getById(@PathVariable String id) {
            if ("007".equals(id)) {
                throw new RuntimeException("007 is a secret agent.");
            }
            return personService.getById(id);
        }
    
        @ExceptionHandler(RuntimeException.class) // this can be an array
        @ResponseBody
        public String handleRuntimeException(RuntimeException ex,
                                             HttpServletRequest request) {
            return "Oops! Something bad happened: "+ex.getMessage();
        }
    }
    

詳細については、Web MVC フレームワーク - 例外の処理を参照してください。

于 2013-05-20T03:11:40.133 に答える