我正在尝试验证
String @PathVariable
KotlinSpring控制器内部。
@RestController
@Validated
@RequestMapping("/kotlin/")
open class KStringController {
@GetMapping(path = ["string/{username}"],
produces = [APPLICATION_JSON_VALUE])
@ResponseBody
fun validateStringPathVariable(
@Pattern(regexp = "[A-Za-z]+", message = "Username Pattern Validation Message")
@Size(min = 2, max = 15, message = "Username Size Validation Message")
@PathVariable("username") username: String?
): ResponseEntity<String>? {
logger.info { String.format("validateStringPathVariable: Got Username [%s]", username) }
System.out.printf("validateStringPathVariable: Username is [%s]%n", username)
return ResponseEntity.ok("Username is valid")
}
}
我对它进行了单元测试:
@ExtendWith(SpringExtension::class)
@WebMvcTest(KStringController::class)
@AutoConfigureMockMvc
class KStringGetControllerTest {
@field:Autowired
private lateinit var mvc: MockMvc
@Test
@Throws(Exception::class)
fun validStringPathVariable() {
val request: MockHttpServletRequestBuilder = givenARequestFor("/kotlin/string/mike")
val actions: ResultActions = whenTheRequestIsMade(request)
thenExpect(actions,
MockMvcResultMatchers.status().isOk,
MockMvcResultMatchers.content().bytes("Username is valid".toByteArray()))
}
@Test
@Throws(Exception::class)
fun shoutsWhenStringPathVariableIsTooShort() {
val request = givenARequestFor("/kotlin/string/a")
val actions = whenTheRequestIsMade(request)
val response = """{
"validationErrors": [
{
"fieldName": "validateStringPathVariable.username",
"message": "Username Size Validation Message"
}
]
}"""
val content = MockMvcResultMatchers.content()
thenExpect(actions,
MockMvcResultMatchers.status().isBadRequest,
content.contentType(MediaType.APPLICATION_JSON),
content.json(response))
}
private fun givenARequestFor(url: String): MockHttpServletRequestBuilder {
return MockMvcRequestBuilders.get(url)
.characterEncoding("UTF-8")
}
@Throws(Exception::class)
private fun whenTheRequestIsMade(request: MockHttpServletRequestBuilder): ResultActions {
return mvc.perform(request)
}
@Throws(Exception::class)
private fun thenExpect(resultActions: ResultActions, vararg matchers: ResultMatcher) {
resultActions.andExpect(ResultMatcher.matchAll(*matchers))
}
目前第二次测试失败;它正在返回一个 200
当我期待一个 400
. 更多的代码https://github.com/mavelous/spring-validation.
1条答案
按热度按时间0yg35tkg1#
在别人的帮助下,我设法找到了解决办法。
快速回答:将函数更改为
open fun validateStringPathVariable
,验证将开始工作。备选答案:使用
org.jetbrains.kotlin.plugin.spring
插件在你的build.gradle
文件。我还写了一篇博文,内容较长:http://mavelo.us/2021/04/07/spring-validation-in-kotlin.html