Я следовал этому руководству, но с kotlin и mysql: https://www.baeldung.com/spring-session-jdbc
Я настроил его, и мои первые два теста пройдены, но мой последний (Чтение атрибутов из сеанса) не... Вот тестовые классы:
@RunWith(SpringRunner::class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
class SpringSessionJdbcIntegrationTest {
@LocalServerPort
private val port: Int = 0
@Autowired
private val testRestTemplate: TestRestTemplate? = null
private val sessionIdsFromDatabase: List<String>
@Throws(SQLException::class)
get() {
val result = ArrayList<String>()
val rs = getResultSet("SELECT * FROM SPRING_SESSION")
while (rs.next()) {
result.add(rs.getString("SESSION_ID"))
}
return result
}
private val sessionAttributeBytesFromDatabase: List<ByteArray>
@Throws(SQLException::class)
get() {
val result = ArrayList<ByteArray>()
val rs = getResultSet("SELECT * FROM SPRING_SESSION_ATTRIBUTES")
while (rs.next()) {
result.add(rs.getBytes("ATTRIBUTE_BYTES"))
}
return result
}
@Throws(SQLException::class)
private fun getResultSet(sql: String): ResultSet {
val conn = DriverManager.getConnection("jdbc:mysql://mysql.stud.iie.ntnu.no:3306/martwa", "martwa", "PPlgWjdv")
val stat = conn.createStatement()
return stat.executeQuery(sql)
}
@Before
@Throws(ClassNotFoundException::class)
fun setup() {
Class.forName("com.mysql.cj.jdbc.Driver")
}
@Test
@Throws(SQLException::class)
fun givenApiHasStarted_whenMySqlDbIsQueried_thenSessionTablesAreEmpty() {
Assert.assertEquals(0, sessionIdsFromDatabase.size.toLong())
Assert.assertEquals(0, sessionAttributeBytesFromDatabase.size.toLong())
}
@Test
@Throws(SQLException::class)
fun givenGetInvoked_whenMySqlDbIsQueried_thenOneSessionIsCreated() {
assertThat(this.testRestTemplate!!.getForObject("http://localhost:$port/", String::class.java)).isNotEmpty()
Assert.assertEquals(1, sessionIdsFromDatabase.size.toLong())
}
//The third test
@Test
@Throws(ClassNotFoundException::class, SQLException::class, IOException::class)
fun givenPostInvoked_whenMySqlDbIsQueried_thenSessionAttributeIsRetrieved() {
val map = LinkedMultiValueMap<String, String>()
map.add("color", "red")
this.testRestTemplate!!.postForObject("http://localhost:$port/saveColor", map, String::class.java)
val queryResponse = sessionAttributeBytesFromDatabase
Assert.assertEquals(1, queryResponse.size.toLong())
val `in` = ObjectInputStream(ByteArrayInputStream(queryResponse[0]))
val csrfToken = `in`.readObject()
//val header = csrfToken.getHeaderName()
val obj:List<String> = csrfToken as List<String> //Deserialize byte[] to object
Assert.assertEquals("red", obj[0])
}
Я получаю сообщение об ошибке: java.lang.ClassCastException:
class org.springframework.security.web.csrf.DefaultCsrfToken cannot be cast to class java.util.List (org.springframework.security.web.csrf.DefaultCsrfToken is in unnamed module of loader 'app'; java.util.List is in module java.base of loader 'bootstrap')
Есть ли кто-нибудь, кто знает, как мне извлечь данные из DefaultCsrfToken, или знает, как ядолжен привести его к списку.
Я тоже пытался делать это на Java, но получаю ту же ошибку.