当前位置: 首页 > 知识库问答 >
问题:

SFTP连接的Spring junit测试:com。jcraft公司。jsch公司。JSchException:数据包损坏

郦兴德
2023-03-14

我一直在本地重新创建此示例:https://github.com/spring-projects/spring-integration-samples/tree/master/basic/sftp

但这次只使用注释而不是xml配置。我有这样的东西:

@Configuration
public class SftpExampleBeanClasses extends SftpConfig {

@Bean
public CachingSessionFactory<LsEntry> sftpSessionFactory() throws IOException {
    DefaultSftpSessionFactory sftpSessionFactory = new DefaultSftpSessionFactory();
    sftpSessionFactory.setHost(this.host);
    sftpSessionFactory.setPort(this.port);
    sftpSessionFactory.setUser(this.username);
    InputStream stream = new ClassPathResource(this.privatekey).getInputStream();
    sftpSessionFactory.setPrivateKey(new ByteArrayResource(StreamUtils.copyToByteArray(stream)));
    sftpSessionFactory.setPrivateKeyPassphrase(this.passphrase);
    sftpSessionFactory.setAllowUnknownKeys(true);
    return new CachingSessionFactory<LsEntry>(sftpSessionFactory);

    //return sftpSessionFactory;
}

@SuppressWarnings({ "unchecked", "rawtypes" })
@Bean
@ServiceActivator(inputChannel = "ftpChannel", adviceChain = "retryAdvice")
public MessageHandler ftpHandler() throws IOException {
    FileTransferringMessageHandler handler = new FileTransferringMessageHandler(this.sftpSessionFactory());
    handler.setRemoteDirectoryExpression(new LiteralExpression("/"));
    return handler;
}

}

SftpCommon类:

@Configuration
public class SftpCommon extends SftpConfig {

    @Bean
    public int serverPort(){
        if(this.port == -1){
            return EmbeddedSftpServer.PORT;
        }
        return this.port;
    }

    @Bean
    public EmbeddedSftpServer embeddedSftpServer(){
         EmbeddedSftpServer embeddedSftpServer = new EmbeddedSftpServer();
         embeddedSftpServer.setPort(serverPort());
         return embeddedSftpServer;
    }   
}

SftpConfig类别:

@Configuration
@PropertySource(value="classpath:user.properties")
public class SftpConfig {

    @Value("${port}")
    protected
    int port;

    @Value("${username}")
    protected
    String username;

    @Value("${passphrase}")
    protected
    String passphrase;

    @Value("${host}")
    protected
    String host;

    @Value("${private.keyfile}")
    protected
    String  privatekey;

    public String getHost() {
        return host;
    }

    @Bean
    public String getUsername() {
        return this.username;
    }

    @Bean
    public String getPassphrase() {
        return this.passphrase;
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public String getPrivatekey() {
        return privatekey;
    }
}

在我的测试中,我有这样的东西:

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(classes ={SftpExampleBeanClasses.class,SftpCommon.class, SftpConfig.class})
    public class SftpOutboundTransferSample {

    @Autowired
    ApplicationContext applicationContext;

    @Test
    public void testOutbound() throws Exception{

        final String sourceFileName = "README.md";
        final String destinationFileName = sourceFileName +"_foo";

        @SuppressWarnings("unchecked")
        SessionFactory<LsEntry> sessionFactory = (SessionFactory<LsEntry>)


        applicationContext.getBean(CachingSessionFactory.class);
        /* this is the line where I'm getting issues */
        sessionFactory.getSession();
    }

我的stackTrace是:

org.springframework.messaging.MessagingException:未能获取池化项目;嵌套异常ethod.java:606IllegalStateException:未能在org.junit.runners.model.SimpleP1.run项目(SimplePethod.java:50)org.junit.internal.runners.model.CachingSessionFallable.run会话(CachingSessionFallable.java:12)org.junit.runners.model.SftpOut边界TransferSethod.invoke出站(SftpOut边界TransferSethod.java:47)在org.junit.internal.runners.statements.NativeMethod odAccessorIethod.evaluate0(本机方法)在sun.reflect.NativeMethod odAccessorImpl.invoke(NativeMethod odAccessorImpl.java:57)在sun.reflect.在Mjava.lang.reflect.(Mjava.lang.)在org.springframework.integration.util.FrameworkMethod$ool.getReflectiveCall(FrameworkMool.java:178)在org.springframework.integration.file.remote.session.ReflectiveCactory.get(ReflectiveCactory.java:123)在com.spring.example.sftp.FrameworkMample.test(FrameworkMample.java:62)在sun.reflect.InvokeMmpl.invoke(InvokeMethod. java: 17)在org. springframe. test. conttext.家长跑步者1美元.时间表(家长跑步者. java: 71)在org. jite. runners。家长跑步者. runUNICEF(家长跑步者. java: 288)在org. jite. runners。家长跑步者.访问0美元(家长跑步者. java: 58)在org. jite. runners。家长跑步者2美元.评估(家长跑步者. java: 268)在org. springframe. test. cont. Junit4. statement。RunBeforeTestClassCallback.评估(RunBeforeTestClassCallback. java: 61)在org. springframe. test. cont. Junit4. statement。RunAfterTestClassCallbacks.评估(RunAfterTestClassCallbacks. java: 70)在org. jite. runners。家长跑步者. run(家长跑步者. java: 363)在org. springframe. test. cont. Junit4。SprSimplePool. getItem(SimplePool. java: 169)...31更多原因由:java. lang。IllegalStateException:在org. springframe.集成. sftp. sesion连接失败。在org. springframe.集成. sftp. sesion的Sftpsesion. connect(SftpSession. java: 273)。DefaultSftpSessionFactory. get会话(DefaultSftpSessionFactory. java: 388)...36更多原因由:com. jcraft. jsch。JSchException:在com. jcraft. jsch的数据包损坏Ma。会话。start_discard(会话. java: 1067)在com. jcraft. jsch。会话. read(会话. java: 937)在com. jcraft. jsch。会话.连接(会话. java: 309)在com. jcraft. jsch。会话.连接

我在互联网上被搜索过,但老实说,我不理解为什么会出现这种例外:

com.jcraft.jsch.JSchException:数据包损坏

我的log4j。xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

    <!-- Appenders -->
    <appender name="console" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{HH:mm:ss.SSS} %-5p [%t][%c] %m%n" />
        </layout>
    </appender>

    <!-- Loggers -->
    <logger name="org.springframework.integration">
        <level value="warn" />
    </logger>

    <logger name="org.springframework.integration.samples">
        <level value="info" />
    </logger>

    <logger name="log4j.category.com.jcraft.jsch">
        <level value="debug" />
        <appender-ref ref="console" />
    </logger>

    <!-- Root Logger -->
    <root>
        <priority value="debug" />
        <appender-ref ref="console" />
    </root>

</log4j:configuration>

[更新]完整ECLIPSE的输出(控制台)如下:https://gist.github.com/columb1a/fe2d4dccabb6a5d9cecd3225d2a591dc

共有1个答案

张通
2023-03-14

我解决了我的问题:

在我的*. Properties文件中,服务器的端口号为-1。然后服务器尝试启动,如果它能够找到-1以外的端口(随机端口),则它会自动启动。然后我必须在我的SFTP会话中注入该随机端口号。关键是,我在我的sftp会话中使用了“-1”值(在我的*. Properties文件中声明),而不是使用服务器生成的随机值。然后我的会话无法连接到服务器。

需要考虑的要点:

  • 不幸的是,在这种情况下,jsch的“调试”级别没有用处
  • 堆栈跟踪是一个“提示”,因为如果您无法连接,那么这可能意味着您使用了错误的参数进行连接(可能)。因此,至少在我的情况下,我在会话中使用了错误的端口号
 类似资料:
  • 我使用的是camel version2.13.1和camel-ftp version2.13.1。我正试图通过camel路由连接到sftp服务器。我得到了一些与jCraft Jsch异常相关的错误,如下所示。

  • 本文向大家介绍比较公司和公司。,包括了比较公司和公司。的使用技巧和注意事项,需要的朋友参考一下 公司与公司之间的主要区别如下- 公司 成立公司 这是经营业务的实体。 注册为公司的第一步。 它被称为CORP。 它被称为INC。 第二阶段的业务。 进行公司注册手续。 持有个人资产负债。 有限责任。 成立过程的结果。 应遵循法律程序。 不要为公司筹集资金。 充当集资渠道。 与日常业务活动有关。 维护所有

  • #在找工作求抱抱# #如何判断面试是否凉了# #找工作中的意难平# #2023届春招# TCP和UDP的区别 C++中多态的使用(期末考试即视感) C++中类和结构体的区别(答得不好) C++空类中有什么函数(满脑子big Five,5个,用的时候都记得,名字真背不全) 数据库没问 项目也没问…… 感觉真不怎么样

  • 大概20min 也没问太多问题 就问了我知不知道我负责的项目的后端流程 就是都什么模块啊,模块之间的关系啥的 我说不清楚 有问了下python 子类调用父类的方法 还有创建进程的都有哪些方式 还有一些其他小问题 感觉自己G了

  • 我正在尝试从我的本地主机(在 Windows 上)测试我们的曼德里尔 API。似乎我需要配置“本地颁发者证书”。因此,我下载了 http://curl.haxx.se/ca/cacert.pem 并将其保存在我的文档根目录(c:\wamp\www)中。然后,在我的 php.ini 文件中,我配置了这个: 。 当我运行 Mandrill 的示例代码时,我收到以下错误: 出现mandrill错误:Ma

  • 我无法从我的django站点连接到我的postgres数据库。在开始之前,我已经阅读并尝试了以下每个站点提供的说明: 詹戈设置:通灵镜2。操作错误: FATAL: 对等身份验证失败的用户 “独立” 操作错误: (心理医生 2.操作错误) FATAL: 用户的密码身份验证失败 致命:用户“根”后gresql的密码身份验证失败 postgresql: FATAL: 用户“道格拉斯”的密码身份验证失败