验证kotlin控制器中的spring@pathvariable

xdnvmnnf  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(347)

我正在尝试验证
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.

0yg35tkg

0yg35tkg1#

在别人的帮助下,我设法找到了解决办法。
快速回答:将函数更改为 open fun validateStringPathVariable ,验证将开始工作。
备选答案:使用 org.jetbrains.kotlin.plugin.spring 插件在你的 build.gradle 文件。
我还写了一篇博文,内容较长:http://mavelo.us/2021/04/07/spring-validation-in-kotlin.html

相关问题