小编Jim*_*m C的帖子

如何使用高阶函数来检查Web服务的返回是否为null使用Optional并避免noSuchElementException

上下文:我有一个Web服务,它返回一个带有menbers的家庭.一个家庭将永远有一个父亲和一个母亲,没有孩子或多个孩子.该服务在下面由wsdl描述.

目的:我想有效地使用Java 8中的Optional,并避免使用经典方法来检查null.经典,我的意思是我们习惯于在Java 7之前完成的方式.

如果我假设webservice将始终返回一个家庭,这就足够了:

@Test
public void test1() {
    Family f = helloWorldClientImplBean.allFamily();

    f.getChildren().stream().filter(x -> x.getFirstName().equalsIgnoreCase("John")).findFirst()
            .ifPresent(y -> System.out.println(y.getLastName()));
}
Run Code Online (Sandbox Code Playgroud)

我测试了,我可以看到,只要我得到一个家庭通过服务回答,如果我有孩子,这将完全无关紧要.我的意思是,在下面的服务实现中,如果我评论了oldSon和youngSon代码,那么根本就没有null异常.

当服务返回null时,问题会引发.

在阅读了几篇博客并讨论了它之后,我得到了这个代码,它正确地检查了服务的返回是否为空.

@Test
public void testWorkingButSeemsOdd() {

    //Family f = helloWorldClientImplBean.allFamily();
    Family f = null; //to make simple the explanation

    Optional<Family> optFamily = Optional.ofNullable(f);

    if (optFamily.isPresent()) {

        optFamily.filter(Objects::nonNull).map(Family::getChildren).get().stream().filter(Objects::nonNull)
                .filter(x -> x.getFirstName().equalsIgnoreCase("John")).findFirst()
                .ifPresent(y -> System.out.println("Optional: " + y.getLastName()));

    }
Run Code Online (Sandbox Code Playgroud)

对我来说更干净的是这些方法中的一种(所有这些方法都令人费解,但我相信它们可以展示我一直在尝试做的事情):

//这里我尝试在映射之前过滤f是否为null

@Test
public void testFilterNonNull() {
    Family f = null;
    Optional.ofNullable(f).filter(Objects::nonNull).map(Family::getChildren).get().stream().filter(Objects::nonNull)
            .filter(x -> x.getFirstName().equalsIgnoreCase("John")).findFirst()
            .ifPresent(y -> System.out.println(y.getLastName()));

}
Run Code Online (Sandbox Code Playgroud)

我知道下一个没有编译,但我想有可能达到类似的东西 …

lambda stream optional higher-order-functions java-8

2
推荐指数
1
解决办法
63
查看次数

如何从其余服务开始批处理。afterJob运行,但是EnableBatchProcessing仅在部署后运行

我遵循了https://spring.io/guides/gs/batch-processing/教程,该教程基本上是读取电子表格,并在应用程序启动后将数据插入数据库中。我想在每次启动休息服务时执行读取过程,因此我在此应用程序中添加了一个控制器。打电话给我,我遵循了如何使用Rest Web Service触发工作中的建议现在出现了我的问题:每当我调用rest服务时,它仅运行afterJob方法。我阅读了如何根据应用程序参数选择要运行的spring批处理作业-Spring Boot Java Config(与我的问题有一定的相似之处)和其中指出的出色博客文章,但我仍然受困。我想在其余服务之后调用“ public ItemReader reader()”,我希望遵循与通过main()启动应用程序时执行的流程相同的流程。我的意思是,与springboot部署时的流程相同。我想我的困惑在于@EnableBatchProcessing或JobExecutionListenerSupport,但我真的很坚持。以下是最重要的代码段。

控制者

@Autowired
JobLauncher jobLauncher;

@Autowired
Job job;

@RequestMapping("/runit")
public void handle() throws Exception{
       JobParameters jobParameters =
                       new JobParametersBuilder()
                       .addLong("time",System.currentTimeMillis()).toJobParameters();
        jobLauncher.run(job, jobParameters);
}
Run Code Online (Sandbox Code Playgroud)

听众

@Component
public class JobCompletionNotificationListener extends   
    JobExecutionListenerSupport {

    @Override
    public void afterJob(JobExecution jobExecution) {
        if(jobExecution.getStatus() == BatchStatus.COMPLETED) {
Run Code Online (Sandbox Code Playgroud)

批量配置

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
    // tag::readerwriterprocessor[]
    @Bean
    public ItemReader<Person> reader() {
        FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
        reader.setResource(new ClassPathResource("sample-data.csv"));
        reader.setLineMapper(new DefaultLineMapper<Person>() …
Run Code Online (Sandbox Code Playgroud)

spring spring-mvc spring-batch spring-boot

1
推荐指数
1
解决办法
9922
查看次数

由 Docker-Compose 启动的 Mongo-Express 导致错误 [MongoError]:首次连接时无法连接到服务器 [mongo:27017]

场景:我想从同一个 docker-compose 启动 Mongo 和 Mongo-Express。

我只从 docker-compose 启动 mongodb 没有问题。当我尝试将 Mongo-Express 链接到 Mongo DB 服务时,问题就出现了。

我不确定我是否缺少 docker-compose 或 mongo-express 设置中的某些配置。我不希望这个问题成为 Mongo 设置的一部分。顺便说一句,我粘贴了整个 docker-compose 及其输出。

从波纹管日志我可以看到提高 Mongo 没有问题。当 mongo-express 尝试连接到 Mongo 服务时会出现一些问题,可能是因为我没有正确设置链接。最重要的是,我的 Spring Webflux 成功连接到具有波纹管属性的 Mongo DB。该问题实际上仅限于 mongo-express 到达 mongodb。

允许 Spring Data (spring-boot-starter-data-mongodb-reactive) 成功连接到此类 MongoDb 的 application.yml

spring:
  data:
    mongodb:
      host: 192.168.99.100
      port:  27017
      database: demodb
      authentication-database: admin
      username: root
      password: rootpassword
Run Code Online (Sandbox Code Playgroud)

docker-compose.yml

version: '3.7'

services:
  mongo-express:
    image: mongo-express
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_BASICAUTH_USERNAME: admin
      ME_CONFIG_BASICAUTH_PASSWORD: q
      ME_CONFIG_MONGODB_PORT: 27017 …
Run Code Online (Sandbox Code Playgroud)

mongodb spring-data-mongodb docker docker-compose mongo-express

1
推荐指数
2
解决办法
4010
查看次数

如何在String.replaceAll中使用RegEx在搜索和替换时忽略中间字符

我必须在testFile.xml中搜索每个单词"abc"+ 7个不重要的数字+"myOldWord"来更改为一些新内容而不用担心里面的数字.会有几个"xxx9999999myOldWorld".如何找到"abc1234567myOldWorld"并使用正则表达式替换newWorld的myOldWorld?我不仅可以从myOldWorld交换到newWord,因为必须在搜索条件中使用前三个字符,必须忽略它们之间的未知7长度.

其他例子.让我们说我有新的世界"aaaOtherNewWord"来取代"aaa9999999OtherOldWord"(我不知道搜索时的数字,并且有几个不同的数字).假设testFile.xml中有三个旧单词:aaa1234567OTHEROLDWORD,aaa9876543otheroldword和bbb9876543otheroldword,我想执行replaceAll并得到结果:aaa1234567OtherNewWord和aaa9876543OtherNewWord尊重但是bbb9876543otheroldword不会改变,因为前3位数字与搜索条件不匹配.

我在下面编码成功,我在搜索时忽略了这个案例,但我必须忽略这些数字,我不知道如何用正则表达式做到这一点.

Path path = Paths.get("C:\\testFolder\\testFile.xml");
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("(?i)" + oldWord, newWord);
Run Code Online (Sandbox Code Playgroud)

注意:我使用的是Java 8.

整个测试是:

// C:\ test.xml

<?xml version="1.0" encoding="UTF-8"?>
<c:bps xmlns:c="CertainApp">
<c:bp name="ProductPortfolio" id="myProdPort">

  <!-- must result in ABC1234567MyCompanyWORDProductSubproduct-->
  <c:message type="ABC1234567MyCompanyWorDProductSubproduct" /> 

  <!-- must result in ABC0987654MyCompanyWORDProductSubproduct-->
  <c:message type="ABC0987654MyCompanyWoRdProductSubproduct" />

  <!-- must result in XYZ1234567MyCompanywordproductSubproduct-->
  <c:message type="XYZ1234567MyCompanywOrdproductSubproduct" />

  <!-- nothing changed in next two-->
  <c:message type="XYZ1234567MyCompanyAnyThingproductSubproduct" />
  <c:message type="XYZ0987654MyCompanyAnyThingproductSubproduct" />
</c:bps>  
Run Code Online (Sandbox Code Playgroud)

// C:\ defaults_test包含两个文件

ABCMyCompanyWORDproductSubproduct.xml  //here …
Run Code Online (Sandbox Code Playgroud)

java regex java-8

0
推荐指数
1
解决办法
922
查看次数

为什么 open-wc 脚手架推广 lit-html

我在一家拥有大型 webcomponents 目录的大公司中使用 Polymer 1 和 2 工作了大约一年,我相信 webcomponents 非常有用。我知道像https://adamsilver.io/articles/the-problem-with-web-components/这样的“缺点想法” 。

现在我正在深入研究如何有效地使用 vanilla webcomponents。我刚开始的前提是使用 vanilla web-components 将有助于与 webcomponents 改进保持一致(我无法为这样的想法辩护 - 我现在只是假设这一点)。然后我试图创建一个堆栈来使用 vanilla webcomponents。

在寻找推荐的测试方法时,我访问了https://open-wc.org/testing,我认为它的目的是在不添加特定框架的情况下促进良好实践(来自其网站:“Open Web Components is a community-effort,独立于任何框架或公司”)。这正是我正在寻找的:一种良好的实践和众所周知的推荐,类似于我们对来自 micorservice.io 的微服务(这只是一个类比)。

尝试使用我在 package.json 中得到的脚手架:

  "dependencies": {
    "lit-html": "^1.0.0",
    "lit-element": "^2.0.1"
  }
Run Code Online (Sandbox Code Playgroud)

所以,我的主要问题是:为什么要为 webcomponent 使用 lit-html?

围绕我的主要问题的有用疑问,据我所知,lit-html 是由谷歌和聚合物团队赞助的框架。这不是以某种方式迫使我使用 polifylls 在所有浏览器中运行吗?假设我不关心浏览器不符合 webcomponents,为什么我需要一个框架?

web-component polymer html-templates native-web-component lit-html

0
推荐指数
1
解决办法
320
查看次数

用自己的Executor替换默认的SimpleAsyncTaskExecutor有什么缺点和风险

个人知识:我从javacodegeeks中读到:“... SimpleAsyncTaskExecutor 对于玩具项目来说是可以的,但是对于任何大于它的项目\xe2\x80\x99s 来说有点风险,因为它不限制并发线程并且不重用线程。所以安全,我们还将添加一个任务执行器 bean...”,baeldung提供了一个非常简单的示例,说明如何添加我们自己的任务执行器。但我可以找到任何指导来解释其后果以及一些值得应用的案例。

\n\n

个人愿望:我正在努力为我们的微服务日志提供一个企业架构,以便在 Kafka 主题上发布。对于我基于日志的情况来说,“由于不限制并发线程并且不重用它而导致的风险”这一说法似乎是合理的。

\n\n

我在本地桌面上成功运行了以下代码,但我想知道我是否正确提供了自定义任务执行器。

\n\n

我的问题:考虑到我已经在使用 kafkatempla (即默认情况下同步、单例和线程安全,至少在生成/发送消息方面至少是理解的),下面的配置是否真的朝着正确的方向重用线程并避免意外传播使用 SimpleAsyncTaskExecutor 时创建线程?

\n\n

生产者配置

\n\n
@EnableAsync\n@Configuration\npublic class KafkaProducerConfig {\n\n    private static final Logger LOGGER = LoggerFactory.getLogger(KafkaProducerConfig.class);\n\n    @Value("${kafka.brokers}")\n    private String servers;\n\n    @Bean\n    public Executor taskExecutor() {\n        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();\n        executor.setCorePoolSize(2);\n        executor.setMaxPoolSize(2);\n        executor.setQueueCapacity(500);\n        executor.setThreadNamePrefix("KafkaMsgExecutor-");\n        executor.initialize();\n        return executor;\n    }\n\n    @Bean\n    public Map<String, Object> producerConfigs() {\n        Map<String, Object> props = new HashMap<>();\n        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);\n        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);\n        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, JsonDeserializer.class);\n        return props;\n    }\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

制片人

\n\n …

java spring multithreading apache-kafka spring-boot

0
推荐指数
1
解决办法
3985
查看次数

没有模块化的 Java 11:包不存在,但作为 maven 依赖项添加

我有三个非常简单的应用程序。一个是 COMMON,我将集中安全配置,另一个具有 ZUUL 功能,第三个是 EUREKA SERVER。两者都是 Spring Boot 和 Java 11。虽然我使用的是 Java 11,但我并不依赖模块化(据我所知,在 Spring Boot 中使用模块化特性是没有意义的)。

当我在 Eclipse 中运行所有三个时,我可以成功地按顺序运行服务器,common 和 zuul。当我尝试 maven build 时,出现了主题中提到的错误。

直接的解释是“你在 zuul 类路径中没有共同点”。好吧,据我所知,我在 zuul 类路径中确实有共同点。我想知道是否有任何额外的配置,因为我使用的是 Java 11 但没有使用模块化。

说我使用的是 Java 11 但不是模块化,我的意思是,我有 Java 11,但在三个项目中的任何一个中都没有 module-info.java。

检查 .m2 文件夹并解压缩 common.jar 我确实看到类抱怨。

Zuul 项目 pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.test</groupId>
    <artifactId>zuul</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>zuul</name>
    <description>Zuul project</description>

    <properties>
        <java.version>11</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
    </properties>

    <dependencies> …
Run Code Online (Sandbox Code Playgroud)

java eclipse maven spring-boot java-11

-2
推荐指数
1
解决办法
1322
查看次数