2017-03-16 3 views
0

にXML要求を検証するため、私は@POST@ConsumesであるRESTのAPIを開発しています両方MediaType.APPLICATION_XML、MediaType.APPLICATION_JSON。私は着信要求の検証を実装する必要があります。私はBean Levelの検証JSR-303を望んでいません。すべてのバリデーションを処理するValidationクラスが必要です。アンマーシャリングする前に、受信XMLリクエストに対してインターセプタを設定する必要があります。私はApache cxfインターセプタを調べました。主に、あなたがBean検証を有効にしている場合です。どうすればいい?はインターセプタのREST API

+0

で有効にする必要があります 'BeanValidationFeature'があります。 xmlベースの設定を使用している場合は、次のようにこの機能を注入する必要があります。http://cxf.apache.org/docs/features.html –

答えて

0

私は、BeanValidationFeatureの使用なしでこれを行う方法を発見しました。

public class YourFilter implements ContainerRequestFilter{ 

    @Override 
     public void filter(ContainerRequestContext request){ 
     ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
     final InputStream inputStream = request.getEntityStream(); 
     final StringBuilder builder = new StringBuilder(); 
     try 
     { 
      IOUtils.copy(inputStream, outStream); 
      byte[] requestEntity = outStream.toByteArray(); 
      if (requestEntity.length == 0) { 
       builder.append(""); 
      } else { 
       builder.append(new String(requestEntity,"UTF-8")); 
       request.setEntityStream(new ByteArrayInputStream(requestEntity)); 
       setRequest(builder.toString()); 
       validateYourRequest(builder.toString()); 
      } 
     }catch (Exception ex) { 
      logger.log(Level.TRACE,"Error occured while converting the request into Stream",ex.getCause()); 
     } 
    } 
} 

そしてapplication.context.xml

<bean id="YourFilter" class="com.test.YourFilter"/> 

<jaxrs:server id="restContainer" address="/"> 

    <jaxrs:serviceBeans> 
     <bean class="com.test.YourController" /> 
    </jaxrs:serviceBeans> 

    <jaxrs:extensionMappings> 
     <entry key="json" value="application/json" /> 
     <entry key="xml" value="application/xml" /> 
    </jaxrs:extensionMappings> 

    <jaxrs:providers> 
     <ref bean="jsonProvider" /> 
     <ref bean="jaxbXmlProvider" /> 
     <ref bean="YourFilter"/> 
    </jaxrs:providers> 
</jaxrs:server>