サーバー側でJersey 1.17を使用してRESTリクエストを処理し、JAXB 2を使用してXMLリクエストコンテンツをアンマーシャリングしています。
環境
これは私が使用するジャージー方式です。MyDTOクラスは@XmlRootElementアノテーションを使用します (それ以外の場合は、JAXBElement タイプでパラメーターを定義する必要があります)。
@Path("/myService")
@POST
@Consumes(MediaType.APPLICATION_XML)
public void myService(MyDTO dto) throws Exception
{
// Shouldn't get this far if the XML content in the request was invalid
System.out.println(dto);
}
要件
デフォルトでは、XML コンテンツにエラーがある場合、Sun/Oracle JAXB 実装は例外をスローしません。たとえば、整数属性に ABC などの文字列値を指定すると、例外がスローされるのではなく、単に値が null のままになります。
JAXB 2 では、ValidationEvenHandler を定義できます。次のハンドラー ハンドラーを使用すると、XML アンマーシャリングが必要な方法で例外をスローします。
public class UnmarshallerValidationEventHandler implements ValidationEventHandler {
@Override
public boolean handleEvent(ValidationEvent event) {
// This indicates JAXB that it should continue processing only if the
// severity level is less than error. NOTE: validation event constants
// go in ascending order in level of severity(i.e., 0 WARNING, 1: ERROR, 2 :FATAL_ERROR)
return event.getSeverity() < ValidationEvent.ERROR;
}
}
質問
カスタム検証イベント ハンドラーでアンマーシャラーを使用するために、Jersey に特定の JAXBContext インスタンスを使用させるにはどうすればよいですか?
または、アプリケーションがジャージー メソッドで JAXB のみを使用していることを考えると、JVM インスタンスに対して特定の JAXBContext をグローバルに定義することは適切なオプションです。どうすればそれができますか?