DefaultCsrfToken не может быть приведен к классу java.util.List - PullRequest
0 голосов
/ 28 февраля 2019

Я следовал этому руководству, но с 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, но получаю ту же ошибку.

...