简短的回答。正如 Spring 在他们的文档中所说,您不能将不同的类型混合到单个 @PathVariable 中。
根据Spring IO文档关于@PathVariable
:
@PathVariable 参数可以是任何简单类型,例如 int、long、Date 等。Spring 会自动转换为适当的类型,如果不能这样做,则抛出 TypeMismatchException。
请注意,文档将 @PathVariable 参数概述为不可互换为不同类型的单一对象类型。
此外,在另一个 stackoverflow 问题中回答异常处理是完全正常的,即尝试从 String 中确定 Longtry/catch
甚至不值得工作并且会降低性能。
您可以使用单个@PathVariable
并且有try/catch
块来捕获NumberFormatException
或简单地使用正则表达式。
方法一:异常处理
@RequestMapping(value="/user/{identifier}", method=RequestMethod.GET)
public User findUser(@PathVariable("identifier") String identifier) {
try {
Long long_identifier = Long.parseLong(identifier);
this.userRepository.findByIdOrName(long_identifier);
} catch(NumberFormatException nfe) {
//We know it's a plain string by now.
this.userRepository.findByIdOrName(identifier);
}
}
方法二:正则表达式
注意:如果未找到值,则查询应仅返回空结果。
@RequestMapping(value="/user/{identifier}", method=RequestMethod.GET)
public User findUser(@PathVariable("identifier") String identifier) {
//Check for digits only
String regexpr = "\\d+";
this.userRepository.findByIdOrName(
identifier.matches(regexpr)
? Long.parseLong(identifier)
: identifier
);
}
方法3:使用正则表达式请求映射
@RequestMapping(value="/user/{identifier:[A-Za-z]+}", method=RequestMethod.GET)
public User findUserByString(@PathVariable("identifier") String identifier) {
this.userRepository.findByIdOrName(identifier);
}
@RequestMapping(value="/user/{identifier:[0-9]+}", method=RequestMethod.GET)
public User findUserByLong(@PathVariable("identifier") Long identifier) {
this.userRepository.findByIdOrName(identifier);
}