【发布时间】:2018-02-19 10:23:20
【问题描述】:
我有一个使用 Spring Boot 和 Apache Camel 构建的 Web 应用程序,并且我正在实现一个 REST 接口。
目前,使用 Camel 默认的 Servlet 或 Restlet 组件,我没有在响应中获得 HTTP 状态代码原因。
这是我在将 HTTP 状态代码设置为 403 时收到的示例响应:
< HTTP/1.1 403
< Date: Mon, 19 Feb 2018 10:01:21 GMT
< Server: Restlet-Framework/2.4.0
< Content-Type: application/json
< Content-Length: 75
应该如何:
< HTTP/1.1 403 Forbidden
< Date: Mon, 19 Feb 2018 10:01:21 GMT
< Server: Restlet-Framework/2.4.0
< Content-Type: application/json
< Content-Length: 75
如何配置 Camel/Restlet/Servlet 以在 HTTP 状态代码中包含原因?
我目前的配置:
Application.java
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
private static final Logger appLogger = LoggerFactory.getLogger(Application.class);
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
appLogger.info("--Application Started--");
}
@Bean
public ServletRegistrationBean servletRegistrationBean() {
SpringServerServlet serverServlet = new SpringServerServlet();
ServletRegistrationBean regBean = new ServletRegistrationBean(serverServlet, "/*");
Map<String,String> params = new HashMap<>();
params.put("org.restlet.component", "restletComponent");
regBean.setInitParameters(params);
return regBean;
}
@Bean
public Component restletComponent() {
return new Component();
}
@Bean
public RestletComponent restletComponentService() {
return new RestletComponent(restletComponent());
}
}
路由配置:
@Component
public class RestRouteBuilder extends RouteBuilder {
private static final Logger appLogger = LoggerFactory.getLogger(RestRouteBuilder.class);
private Predicate isAuthorizedRequest = header(HttpHeaders.AUTHORIZATION).isNotNull();
@Override
public void configure() throws Exception {
restConfiguration().component("restlet")
.contextPath("/overlay")
.bindingMode(RestBindingMode.json)
.skipBindingOnErrorCode(false)
.dataFormatProperty("prettyPrint", "true");
rest("/")
.get()
.route()
.setHeader(Exchange.HTTP_RESPONSE_CODE, constant(403))
.setBody(constant("Forbidden"))
.endRest();
}
}
我也尝试添加.setHeader(Exchange.HTTP_RESPONSE_TEXT, constant("Forbidden")),但结果是一样的。
【问题讨论】:
-
试试没有这部分
.component("restlet") -
@pvpkiran 结果一模一样
-
对我来说有效。没有
setBody。这是结果curl --verbose http://localhost:8080/overlay/ * Trying 127.0.0.1... * Connected to localhost (127.0.0.1) port 8080 (#0) > GET /overlay/ HTTP/1.1 > Host: localhost:8080 > User-Agent: curl/7.47.0 > Accept: */* > < HTTP/1.1 403 Forbidden < Server: Restlet-Framework/2.3.6 < Breadcrumbid: ID-Boss-36986-1519039039690-0-5 < Date: Mon, 19 Feb 2018 11:19:34 GMT < Content-type: application/json; charset=UTF-8 < Content-length: 0 -
@pvpkiran 您能否分享您的测试代码和软件包版本,以便我进行比较?谢谢。
-
我有和你一样的代码。除了
.component("restlet"),我也没有 ServletRegistrationBean、Component、RestletComponent bean 声明。我们不需要这个
标签: java rest spring-boot apache-camel restlet