java - AWS lambda + spring boot = 不连接组件

标签 java spring-boot aws-lambda

我正在尝试在我的 AWS lambda 应用程序中使用 spring-boot 来调用 SOAP Web 服务。但看起来它没有 Autowiring 我的 SOAP 组件。 这是我的代码:

@SpringBootApplication(scanBasePackages={"com.fenix"})
@EnableAutoConfiguration
@ComponentScan
public class Aplicacao extends SpringBootServletInitializer {

public static void main(String[] args) {
    SpringApplication.run(Aplicacao.class, args);
}

@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder springApplicationBuilder) {
    return springApplicationBuilder.sources(Aplicacao.class);
}
}

@Configuration
public class Beans {

@Bean
public Jaxb2Marshaller marshaller() {
    Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
    marshaller.setPackagesToScan("com.tranzaxis.schemas", "org.radixware.schemas", "org.xmlsoap.schemas", "com.compassplus.schemas");
    return marshaller;
}

@Bean
public TranClient tranClient(Jaxb2Marshaller marshaller) {
    TranClient client = new TranClient();
    client.setDefaultUri("http://rhel72.tx:12301?wsdl");
    client.setMarshaller(marshaller);
    client.setUnmarshaller(marshaller);
    return client;
}

@Bean(name = "Tran")
public TranClient getTranClient() {
    return tranClient(marshaller());
}
}



public class PostMovimentacao extends Handler implements Service {

@Autowired
@Qualifier("Tran")
private TranClient tranClient;

@Inject
private PessoaCompassBO pessoaCompassBO;

private CompassConfig compassConfig;

private static final Logger LOGGER = Logger.getLogger(PostMovimentacao.class);

@Override
protected ResponseEntity execute(ApiRequest request, Context context) throws HttpException {
    MovimentacaoRequest movimentacaoRequest = new MovimentacaoRequest();
    movimentacaoRequest.setOrigem(669L);
    movimentacaoRequest.setDestino(657L);
    movimentacaoRequest.setValor(BigDecimal.valueOf(1L));

    TranInvoke invoke = tranClient.movimentacaoFinanceira(movimentacaoRequest, compassConfig);  -->NullPointer here
    return ResponseEntity.of(Optional.of(invoke), Optional.empty(), HttpStatus.SC_OK);
}

@Override
public void setup() {
    try {
        compassConfig = CompassConfig.build();
    } catch (InvalidConfigException e) {
        LOGGER.error("Compass config error", e);
    }
}
}

这是我的 pom.xml:

    <build>
    <finalName>integrador-compass</finalName>
     <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>1.5.6.RELEASE</version>
                <configuration>
                    <layout>MODULE</layout>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.6.0</version>
            <configuration>
                <source>${maven.compiler.source}</source>
                <target>${maven.compiler.target}</target>
                <encoding>${project.build.sourceEncoding}</encoding>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>2.3</version>
            <configuration>
                <createDependencyReducedPom>false</createDependencyReducedPom>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.pitest</groupId>
            <artifactId>pitest-maven</artifactId>
            <version>1.1.11</version>
            <configuration>
                <targetClasses>
                    <param>com.fenix.*</param>
                </targetClasses>
                <excludedClasses>
                    <excludedClasse>com.fenix.handler.request*</excludedClasse>
                    <excludedClasse>com.fenix.handler.response*</excludedClasse>
                    <excludedClasse>com.fenix.model*</excludedClasse>
                </excludedClasses>
                <avoidCallsTo>
                    <avoidCallsTo>java.util.logging</avoidCallsTo>
                    <avoidCallsTo>org.apache.log4j</avoidCallsTo>
                    <avoidCallsTo>org.slf4j</avoidCallsTo>
                    <avoidCallsTo>org.apache.commons.logging</avoidCallsTo>
                </avoidCallsTo>
                <timestampedReports>false</timestampedReports>
                <outputFormats>
                    <outputFormat>XML</outputFormat>
                    <outputFormat>HTML</outputFormat>
                </outputFormats>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.16</version>
            <configuration>
                <includes>
                    <include>**/*Tests.java</include>
                    <include>**/*Test.java</include>
                </includes>
            </configuration>
        </plugin>
    </plugins>

    <extensions>
        <extension>
            <groupId>org.springframework.build</groupId>
            <artifactId>aws-maven</artifactId>
            <version>5.0.0.RELEASE</version>
        </extension>
    </extensions>
</build>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.ws</groupId>
        <artifactId>spring-ws-core</artifactId>
    </dependency>

    <dependency>
        <groupId>com.fenix</groupId>
        <artifactId>compass-api</artifactId>
        <version>0.0.15</version>
    </dependency>
    <dependency>
        <groupId>com.fenix</groupId>
        <artifactId>lambda-commons</artifactId>
        <version>1.6.2</version>
    </dependency>
    <dependency>
        <groupId>commons-validator</groupId>
        <artifactId>commons-validator</artifactId>
        <version>1.5.1</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.mockito</groupId>
        <artifactId>mockito-core</artifactId>
        <version>2.6.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.assertj</groupId>
        <artifactId>assertj-core</artifactId>
        <version>3.6.2</version>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>com.mashape.unirest</groupId>
        <artifactId>unirest-java</artifactId>
        <version>1.4.9</version>
    </dependency>
</dependencies>

有人已经使用过这个配置吗?我添加了 spring-boot,因为它是进行 SOAP 调用的唯一方法。如果我尝试仅使用 WSDL 中的代码进行调用,当它尝试连接到服务器时,我收到一条错误消息,指出请求为空。使用 spring-boot,它不需要先连接,它只需发送请求即可正常工作。

欢迎任何帮助。

非常感谢。

最佳答案

显然,Spring Boot 应用程序上下文没有在您的代码中初始化...如果您确实想在 Lambda 函数中使用 Spring Boot,您可以尝试以下操作:

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.4.0.RELEASE</version>
</parent>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-core</artifactId>
        <version>1.11.181</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-lambda-java-core</artifactId>
        <version>1.1.0</version>
    </dependency>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>aws-java-sdk-lambda</artifactId>
        <version>1.11.181</version>
    </dependency>
</dependencies>

服务示例:

@Component
public class MyService {

    public void doSomething() {
        System.out.println("Service is doing something");
    }

}

一些 Bean 示例:

@Component
public class MyBean {

    @Autowired
    private MyService service;

    public void executeService() {
       service.doSomething();
    }

}

Lambda 处理程序示例:

@SpringBootApplication
public class LambdaHandler implements RequestHandler<Request, Response> {

    private ApplicationContext getApplicationContext(String [] args) {
        return new SpringApplicationBuilder(LambdaHandler.class)
                .web(false)
                .run(args);
    }

    public Response handleRequest(Request input, Context context) {
        ApplicationContext ctx = getApplicationContext(new String[]{});
        MyBean bean = ctx.getBean(MyBean.class);

        bean.executeService();

        return new Response();
    }
}

关于java - AWS lambda + spring boot = 不连接组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45838474/

相关文章:

java - 使用 Maven 从多个类文件生成 jar

java - GWT 2.8 无法使自定义链接器工作

java - 热插拔装修?

java - Spring+boot+data - 通过具有关联返回页面的示例进行查询

java - 无法使用 log4j2 写入日志

spring-boot - 用于命令行运行器应用程序的 Spring Boot 执行器

amazon-web-services - 我可以在 AWS Lambda 函数上存储临时文件吗?

java - 什么是组件

aws-lambda - 如何将 FilterCriteria 添加到由 AWS Amplify 创建的 DynamoDB Stream CloudFormation 模板?

amazon-web-services - AWS Lambda 不支持 .Net 5.0