Spring Boot路径变量带下划线无法调用控制器

3

你好,我正在使用Spring Boot 1.3.4。在我的控制器中,我有以下请求映射:

@RequestMapping(value = "name/{name}",method = RequestMethod.GET)
public ResponseEntity<Book> getBooksByName(@Valid @PathVariable("name") String name) {
    final Book h = mongoService.findByBookName(name);

Application.yml

server:
port: 8170
contextPath: /book-repository
spring:
    application:
        name: book-repository
    devtools:
        restart:
            exclude: META-INF/maven/**
            additional-paths: src/main/resources/
bookRepository:
    mongodb:
        connectionStrings:
            bookRepository: mongodb://localhost:27017/contentdb
springfox.documentation.swagger.v2.path: /api/v1
management.add-application-context-header: false

BookRepositoryMain.java

@SpringBootApplication
public class BookRepositoryMain {

public static final Logger LOG = LoggerFactory.getLogger(BookRepositoryMain.class);

public static void main(String[] args) {
    LOG.info("Initialising ...");
    SpringApplication.run(BookRepositoryMain.class, args);
}

}

BookController.java

@Api(value = "books", description = "books endpoint", tags = {"books"}, produces = MediaType.APPLICATION_JSON_VALUE)
@RestController
@RequestMapping(value = PATH, produces = MediaType.APPLICATION_JSON_VALUE)
public class BooksController {
public static final Logger LOG = LoggerFactory.getLogger(BooksController.class);
public static final String PATH = "/books";

@RequestMapping(
        value = "name/{name}",
        method = RequestMethod.GET)
@ApiOperation(
        response = Book.class,
        notes = "",
        value = "Finds Book by its name.")
@ApiResponses({
    @ApiResponse(code = 404, response = ErrorMessage.class, message = "Book not found.")
})
public ResponseEntity<Book> getBookByName(@PathVariable("name") String uid) throws ContentNotFoundException {
    final Book h = deviceMongoService.findByBookName(name);
    if (h == null) {
        throw new BookNotFoundException(String.format("Could not find book with name %s", name));
    }
    final ResponseEntity<Book> response = ResponseEntity.ok().body(h);
    return response;
}

如果URL是"api/v1/books/name/sherlock_homes",那么上述方法不起作用,但是如果URL是"api/v1/books/name/sherlockHomes",那么它可以正常使用

可能是什么问题?为什么Spring不允许路径变量中有下划线?

感谢您的帮助。


这对我很好用,请提供一个 [mcve]。 - Sotirios Delimanolis
@SotiriosDelimanolis 让我添加一个application.yml文件。 - VelNaga
@SotiriosDelimanolis 我已经更新了我的问题,包括主类和控制器类。 - VelNaga
能否描述一下“不起作用”是什么意思?您是否遇到了404错误?您期望发生什么事情,实际上又发生了什么? - Sotirios Delimanolis
@SotiriosDelimanolis 没有错误。控制权没有到达该方法。在控制台中,我可以看到没有找到匹配项。 - VelNaga
显示剩余4条评论
1个回答

1
您可以在@RequestMapping的值中使用正则表达式。例如,您可以尝试以下内容:
@RequestMapping(value = "name/{name:.+}",method = RequestMethod.GET)

这在Spring文档中有记录,同时也可以在类似问题中找到。

@Lakshita 抱歉,它不起作用。我已经尝试过那个例子了。 - VelNaga
@SotiriosDelimanolis 因为我过去做过类似的事情?你有什么解决方案? - Laksitha Ranasingha
@SotiriosDelimanolis 带有“_”下划线的路径变量无法正常工作。使用字母数字字符时可以正常工作。 - VelNaga
我已经按你的要求进行了评论。谁说我的评论就是一个答案呢?答案已经在那里了。 - Laksitha Ranasingha
奇怪,这解决了我的问题,那现在呢?点个赞。 - Audrius Meškauskas
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接