【问题标题】:Interceptor for validating XML request in REST API用于在 REST API 中验证 XML 请求的拦截器
【发布时间】:2017-03-23 21:04:29
【问题描述】:
我正在开发一个 REST API,它是 @POST 和 @Consumes 两者都是 MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON 。我需要对传入的请求进行验证。我不想拥有 Bean 级别验证 JSR-303。我需要一个 Validation 类来处理所有验证,并且我需要在 Unmarshalling 之前为传入的 XML 请求配置拦截器。我查看了 Apache cxf 拦截器,主要是如果您启用了 Bean 验证。我该怎么办?
【问题讨论】:
标签:
java
spring
rest
cxf
interceptor
【解决方案1】:
我找到了不使用 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>