You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Bjorn Beskow (Jira)" <ji...@apache.org> on 2025/06/01 17:06:00 UTC
[jira] [Comment Edited] (CAMEL-22116) camel-openapi-validator doesn't work for contract-first api's with Spring Boot
[ https://issues.apache.org/jira/browse/CAMEL-22116?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17955485#comment-17955485 ]
Bjorn Beskow edited comment on CAMEL-22116 at 6/1/25 5:05 PM:
--------------------------------------------------------------
Great! Thanks for protecting the architecutral ingegrity, Claus. Your fix is at the appropriate place, which my original suggestion wasn't.
I'm still having issued with the fix ([https://github.com/apache/camel-spring-boot/commit/f73942b48973eee325430e8db13bc5e1b2e1a893)|https://github.com/apache/camel-spring-boot/commit/f73942b48973eee325430e8db13bc5e1b2e1a893:] however:
{code:java}
@Override
protected String getRawPath(HttpServletRequest request) {
String uri = request.getRequestURI();
String contextPath = request.getContextPath() == null ? "" : request.getContextPath();
String servletPath = request.getServletPath() == null ? "" : request.getServletPath();
if (contextPath.isEmpty()) {
return servletPath;
}
return uri.substring(contextPath.length() + servletPath.length());
} {code}
I'm puzzled by the if statement. I can see how the fix solves the problem when contextPath is not used (i.e. is empty). But if context-path is non-empty, we however end up in the same behavior - rawPath evaluates to ''.
If getRawPath() is simplified like this:
{code:java}
@Override
protected String getRawPath(HttpServletRequest request) {
String contextPath = request.getContextPath() == null ? "" : request.getContextPath();
String servletPath = request.getServletPath() == null ? "" : request.getServletPath();
return contextPath + servletPath;
} {code}
it works correctly for both with and without a server.servlet.context-path set.
was (Author: beskow):
Great, thanks! So the fix is [https://github.com/apache/camel-spring-boot/commit/f73942b48973eee325430e8db13bc5e1b2e1a893:]
{code:java}
@Override
protected String getRawPath(HttpServletRequest request) {
String uri = request.getRequestURI();
String contextPath = request.getContextPath() == null ? "" : request.getContextPath();
String servletPath = request.getServletPath() == null ? "" : request.getServletPath();
if (contextPath.isEmpty()) {
return servletPath;
}
return uri.substring(contextPath.length() + servletPath.length());
} {code}
I'm however puzzled by the if statement. I can see how the fix solves the problem when contextPath is not used (i.e. is empty). But if context-path is non-empty, we however end up in the same behavior - rawPath evaluates to ''.
If getRawPath() is simplified like this:
{code:java}
@Override
protected String getRawPath(HttpServletRequest request) {
String contextPath = request.getContextPath() == null ? "" : request.getContextPath();
String servletPath = request.getServletPath() == null ? "" : request.getServletPath();
return contextPath + servletPath;
} {code}
it works correctly for both with and without a server.servlet.context-path set.
> camel-openapi-validator doesn't work for contract-first api's with Spring Boot
> ------------------------------------------------------------------------------
>
> Key: CAMEL-22116
> URL: https://issues.apache.org/jira/browse/CAMEL-22116
> Project: Camel
> Issue Type: Bug
> Components: camel-spring-boot, rest
> Affects Versions: 4.10.4, 4.11.0, 4.12.0
> Reporter: Bjorn Beskow
> Assignee: Claus Ibsen
> Priority: Minor
> Fix For: 4.8.8, 4.10.6, 4.13.0
>
>
> Using camel-openapi-validator with an contract-first api such as [https://github.com/apache/camel-spring-boot-examples/openapi-contract-first] results in an HTTP 400 for all endpoints:
>
> {code:java}
> > curl http://localhost:8080/api/v3/pet/1
> Validation failed.
> [ERROR][GET ] No API path found that matches request ''.{code}
> This is caused by the CamelHttpPath set to '' by camel-platform-http, which is used to select endpoint from the openapi specification.
> The "CamelPlatformHttpContextPath" is however correctly set by SpringBootPlatformHttpConsumer, and hence the correct value for path can be calculated:
> {code:java}
> String path = exchange.getMessage().getHeader(Exchange.HTTP_PATH, String.class);
> // Workaround for camel-platform-http which does not properly set HTTP_PATH header
> if (StringUtils.isEmpty(path)) {
> String uri = exchange.getMessage().getHeader(Exchange.HTTP_URI, String.class);
> String contextPath = exchange.getMessage().getHeader("CamelPlatformHttpContextPath", String.class);
> if (StringUtils.isNotEmpty(contextPath) && uri.startsWith(contextPath)) {
> path = uri.substring(contextPath.length());
> }
> } {code}
> With path correctly set, the corresponding endpoint can be found in the openapi specification, which corrects the problem.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)