一、mave配置
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-simple</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxrs</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-security-cors</artifactId>
<version>2.6.1</version>
</dependency>
<!-- <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-transports-http</artifactId>
<version>3.0.4</version> </dependency> -->
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-extension-providers</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>javax.ws.rs</groupId>
<artifactId>jsr311-api</artifactId>
<version>1.1.1</version>
</dependency>
因为公司的jdk版本低所以使用的包版本较低
二、spring配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxws="http://cxf.apache.org/jaxws"
xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:cxf="http://cxf.apache.org/core"
xsi:schemaLocation="http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
default-autowire="byName" default-lazy-init="true">
<description>Apache CXF的Web Service配置</description>
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
<!-- address-请求路径 -->
<jaxrs:server id="kpiResource" address="/">
<!-- 输入拦截器设置 -->
<jaxrs:inInterceptors>
<bean class="com.**.rs.security.KpiMessageInInterceptor" />
</jaxrs:inInterceptors>
<!-- 输出拦截器设置 -->
<jaxrs:outInterceptors>
<bean class="com.**.rs.security.KpiMessageOutInterceptor" />
</jaxrs:outInterceptors>
<!-- serviceBeans-暴露的WebService服务类 -->
<jaxrs:serviceBeans>
<ref bean="pointService" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<bean class="org.codehaus.jackson.jaxrs.JacksonJsonProvider"></bean>
</jaxrs:providers>
<!-- 支持的协议 -->
<jaxrs:extensionMappings>
<entry key="json" value="application/json" />
<entry key="xml" value="application/xml" />
</jaxrs:extensionMappings>
<!-- 编码格式 -->
<!-- <jaxrs:languageMappings> <entry key="en" value="en-gb" /> </jaxrs:languageMappings> -->
</jaxrs:server>
</beans>
三、代码
KpiMessageInInterceptor、KpiMessageOutInterceptor类都继 AbstractPhaseInterceptor<Message>
四、注意事项
1、web.xml 需加上
<!-- CXF Servlet -->
<servlet>
<servlet-name>CXFService</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CXFService</servlet-name>
<url-pattern>/rs/*</url-pattern>
</servlet-mapping>
2、第二点spring配置中必须暴露服务,不然会报错
3、 拦截器实现类 中的重载方法
@Override
public void handleMessage(Message message) throws Fault {}可以用
//异常则直接返回
if(null==request){
request=new MessageWrapper();
}
Map<String,Object> reMap=new HashMap<String,Object>();
reMap.put("return_code", "1");
reMap.put("return_msg", e.getMessage());
try {
HttpServletResponse response = (HttpServletResponse)message.get(AbstractHTTPDestination.HTTP_RESPONSE);
ServletOutputStream out = response.getOutputStream();
String outMsg = jsonMapper.writeValueAsString(reMap);
request.setMessageBody(outMsg);
request.setSign(null);
outMsg=jsonMapper.writeValueAsString(request);
logger.info("回送字符串:" + outMsg);
out.write(outMsg.getBytes(CHAT_SET));
out.flush();
out.close();
message.getInterceptorChain().doInterceptStartingAfter(message, "org.apache.cxf.jaxrs.interceptor.JAXRSOutInterceptor");
} catch (Exception ex) {
throw new Fault(ex);
}
方式直接返回结果,不抛出异常,直接抛出异常直接返回异常xml不是json