원클릭으로
sftp
JSch SFTP-mønstre: SftpConfig.channel {} livssyklus, FtpService fil-operasjoner, Directories enum og SftpListener integrasjonstest-fixture
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
JSch SFTP-mønstre: SftpConfig.channel {} livssyklus, FtpService fil-operasjoner, Directories enum og SftpListener integrasjonstest-fixture
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Flyway-migrasjoner for PostgreSQL: navnekonvensjoner (V{n}__desc.sql), skjema for krav/feilmelding/filvalideringsfeil, DBListener-testing med TestContainers
Post-send livssyklus: StatusService poller /mottaksstatus; StoppKravService; RapportService + AvstemmingRouting-frontend for manuell reskontroføring
HOCON-basert konfigurasjon med PropertiesConfig singleton for Ktor batch-tjenester på NAIS (FSS)
SlackService feilakkumulering og Tags-basert varsling for prosesseringsfeil i SKE-batch
Endring av eksisterende krav (endre rente og endre hovedstol): EndreKravService, request-DTOer, status-konformering og SKE API PUT-endepunkter
Kotest BehaviorSpec/MockK-mønstre for sokos-ske-krav: scenariostruktur, DBListener/SftpListener, MockHttpClient, circuit-breaker-reset og matchers
| name | sftp |
| description | JSch SFTP-mønstre: SftpConfig.channel {} livssyklus, FtpService fil-operasjoner, Directories enum og SftpListener integrasjonstest-fixture |
SFTP-mønstre med JSch: SftpConfig.channel {}, FtpService, Directories og SftpListener for testing.
This project uses JSch (
com.github.mwiede:jsch) for SFTP. Authentication is RSA private key only — no password auth. All SFTP operations go throughSftpConfig.channel {}, which opens a session + channel and closes them infinally.
Never open JSch sessions or ChannelSftp channels directly in service code. Always use SftpConfig.channel {}:
class SftpConfig(
private val sftpProperties: SftpProperties = PropertiesConfig.sftpProperties,
) {
private val jsch: JSch =
JSch().apply {
JSch.setLogger(JSchLogger())
addIdentity(
sftpProperties.privateKeyFilePath,
sftpProperties.trimmedPrivateKeyPassword,
)
}
fun <T> channel(operation: (ChannelSftp) -> T): T {
var session: Session? = null
var sftpChannel: ChannelSftp? = null
try {
session = jsch.getSession(
sftpProperties.trimmedUsername,
sftpProperties.host,
sftpProperties.port,
).apply {
setConfig("StrictHostKeyChecking", "no")
connect()
}
sftpChannel = (session.openChannel("sftp") as ChannelSftp).apply { connect() }
return operation(sftpChannel)
} finally {
sftpChannel?.disconnect()
session?.disconnect()
}
}
}
SftpProperties.trimmedUsername and trimmedPrivateKeyPassword strip whitespace from Vault-sourced values — always use the trimmed getters.
Use the Directories enum for all path references — never hardcode strings:
enum class Directories(val value: String) {
OUTBOUND("/outbound"),
INBOUND("/inbound"),
FAILED("/inbound/feilfiler"),
}
SftpConfig.channel {} — never open JSch sessions directly in service or test codeDirectories enum for pathssftpProperties.trimmedUsername and trimmedPrivateKeyPasswordTEAM_LOGS_MARKERlistFiles().sorted())Directories.FAILED before persisting validation errorsStrictHostKeyChecking = yes in production (not supported by the SFTP server)channel {} call)TEAM_LOGS_MARKER