如何将HttpServletResponse转换为javax.ws.rs.core.Response
我正在开发一个日志框架。日志框架是使用cxf和javax.ws.rs.core.Response编写的,我使用SpringMVC编写了一个拦截器。 我正在尝试将HttpServletResponse发送到javax.ws.rs.core.Response,因为HttpServletResponse没有getStatus()方法,如何将状态设置为javax.ws.rs.core.Response如何将HttpServletResponse转换为javax.ws.rs.core.Response,java,spring,servlets,model-view-controller,cxf,Java,Spring,Servlets,Model View Controller,Cxf,我正在开发一个日志框架。日志框架是使用cxf和javax.ws.rs.core.Response编写的,我使用SpringMVC编写了一个拦截器。 我正在尝试将HttpServletResponse发送到javax.ws.rs.core.Response,因为HttpServletResponse没有getStatus()方法,如何将状态设置为javax.ws.rs.core.Response package com.logging; import javax.servlet.http.Htt
package com.logging;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.joda.time.LocalDateTime;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@Component
public class RequestLoggingInterceptor extends HandlerInterceptorAdapter {
private static final Log logger =
LogFactory.getLog(RequestConversationPersister.class); private static final
String HEADER_DEVICEID = "deviceid";
private static final String HEADER_DEVICEID_NOTPROVIDED_VALUE =
"DEVICEID_NOTPROVIDED";
private static final String HEADER_POLICYNUMBER = "policynumber";
private static final String HEADER_POLICYNUMBER_NOTPROVIDED_VALUE =
"POLICYNUMBER_NOTPROVIDED";
private static final String HEADER_USERID = "userid";
private static final String HEADER_USERID_NOTPROVIDED_VALUE =
"USERID_NOTPROVIDED";
private static final String INSERT_STATEMENT = "Insert Into LOGNMSWS
(CONVERSATION_ID, DEVICE_ID, REQUEST_URL, RESPONSE_STATUS, DATETIME,
POLICYNUMBER, USERID) Values (?, ?, ?, ?, ?, ?, ?)";
protected static ThreadLocal<RequestGendroidServiceConversation>
conversation = new ThreadLocal<RequestGendroidServiceConversation>();
// A spring abstraction of for JDBC, it handles exceptions and opening
//and
// closing connections
RequestConversationContainer container;
JdbcTemplate jdbcTemplate;
public RequestLoggingInterceptor( DataSource dataSource,
RequestConversationContainer container) {
if ((dataSource == null) || (container == null)) {
throw new IllegalArgumentException("Neither dataSource or
container may be null");
}
jdbcTemplate = new JdbcTemplate(dataSource);
this.container = container;
}
public RequestLoggingInterceptor() {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler) throws Exception {
String deviceid = request.getHeader(HEADER_DEVICEID) != null ?
request.getHeader(HEADER_DEVICEID) : HEADER_DEVICEID_NOTPROVIDED_VALUE;
String policynumber = request.getHeader(HEADER_POLICYNUMBER) != null
? request.getHeader(HEADER_POLICYNUMBER) :
HEADER_POLICYNUMBER_NOTPROVIDED_VALUE;
String userid = request.getHeader(HEADER_USERID) != null ?
request.getHeader(HEADER_USERID) : HEADER_USERID_NOTPROVIDED_VALUE;
int status = response.SC_OK;
System.out.println("---------> status"+ status);
RequestGendroidServiceConversation gsc = new
RequestGendroidServiceConversation(deviceid,
request.getRequestURL().toString(),policynumber,userid);
logger.debug("Handling GendroidConversation with id: " +
gsc.getConversationID());
// We don't want to interrupt or fail the response being handled by the
// executing thread so we'll catch and log any exceptions.
try {
container.add(gsc);
conversation.set(gsc);
} catch (Exception e) {
logger.error(e);
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse
response, Object handler, ModelAndView mav) throws Exception {
RequestGendroidServiceConversation gsc = conversation.get();
if (gsc != null) {
try {
gsc.setResponseTime(new LocalDateTime());
gsc.setResponseStatus(HttpServletResponse.SC_OK); //----------->
//here I hard coded with SC_OK but I need to send status
} catch (Exception e) {
logger.error("Could not retrieve Gendroid service conversation
due to exception :" + e.getMessage());
} finally {
conversation.remove();
}
}
}
}
package.com.logging;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.sql.DataSource;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入org.joda.time.LocalDateTime;
导入org.springframework.jdbc.core.jdbc模板;
导入org.springframework.stereotype.Component;
导入org.springframework.web.servlet.ModelAndView;
导入org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
@组成部分
公共类RequestLoggingInterceptor扩展了HandlerInterceptorAdapter{
专用静态最终日志记录器=
LogFactory.getLog(RequestConversationPersister.class);私有静态final
字符串标题_DEVICEID=“DEVICEID”;
私有静态最终字符串头\u设备ID\u未提供\u值=
“未提供设备ID”;
私有静态最终字符串头\u POLICYNUMBER=“POLICYNUMBER”;
私有静态最终字符串头\u策略编号\u未提供\u值=
“未提供保单编号”;
私有静态最终字符串头\u USERID=“USERID”;
私有静态最终字符串头\u用户标识\u未提供\u值=
“未提供用户标识”;
私有静态最终字符串INSERT_STATEMENT=“INSERT Into LOGNMSWS
(会话ID、设备ID、请求URL、响应状态、日期时间、,
POLICYNUMBER,USERID)值(?,,,,,,,,,,?)”;
受保护的静态线程本地
conversation=newthreadlocal();
//作为JDBC的spring抽象,它处理异常和打开
//及
//关闭连接
请求会话容器;
jdbc模板jdbc模板;
public RequestLoggingInterceptor(数据源数据源,
RequestConversationContainer(容器){
if((数据源==null)| |(容器==null)){
抛出新的IllegalArgumentException(“数据源或
容器可能为空“);
}
jdbcTemplate=新的jdbcTemplate(数据源);
this.container=容器;
}
公共RequestLoggingInterceptor(){
}
@凌驾
公共布尔预处理(HttpServletRequest、HttpServletResponse
响应,对象处理程序)引发异常{
字符串deviceid=request.getHeader(HEADER\u deviceid)!=null?
getHeader(HEADER\u DEVICEID):HEADER\u DEVICEID\u未提供\u值;
字符串policynumber=request.getHeader(HEADER\u policynumber)!=null
?请求。getHeader(HEADER_POLICYNUMBER):
标题\u保单编号\u未提供\u值;
字符串userid=request.getHeader(HEADER\u userid)!=null?
getHeader(HEADER\u USERID):HEADER\u USERID\u NOTPROVIDED\u值;
int status=response.SC_OK;
System.out.println(“----------->状态”+状态);
RequestGendroidServiceConversation gsc=新建
RequestGendroidServiceConversation(设备ID,
request.getRequestURL().toString(),policynumber,userid);
debug(“处理id为:”+
gsc.getConversationID());
//我们不希望中断或使服务器处理的响应失败
//执行线程,以便捕获并记录任何异常。
试一试{
容器。添加(gsc);
会话集(gsc);
}捕获(例外e){
错误(e);
}
返回true;
}
@凌驾
public void postHandle(HttpServletRequest请求,HttpServletResponse
响应、对象处理程序、ModelAndView(mav)引发异常{
RequestGendroidServiceConversation gsc=conversation.get();
如果(gsc!=null){
试一试{
setResponseTime(新的LocalDateTime());
gsc.setResponseStatus(HttpServletResponse.SC_OK);/----------->
//在这里,我硬编码与SC_确定,但我需要发送状态
}捕获(例外e){
logger.error(“无法检索Gendroid服务对话
由于异常:“+e.getMessage());
}最后{
会话。删除();
}
}
}
}
这是肯定的:也许您使用的是过时的(3.0之前的)servlet API?是的,我们使用的是servlet API 2.5,我们无法升级到3.0,因为我们所有的应用程序都使用2.5,但是有没有其他解决方案可以让它设置状态?