小编Ice*_*nte的帖子

Java Streams:将集合组织到地图中并选择最小的键

我很确定这在一行中是不可能的,但我只是想检查一下:

List<WidgetItem> selectedItems = null;
Map<Integer, List<WidgetItem>> itemsByStockAvailable = WidgetItems.stream()
     .collect(Collectors.groupingBy(WidgetItem::getAvailableStock));
selectedItems = itemsByStockAvailable.get(
     itemsByStockAvailable.keySet().stream().sorted().findFirst().get());
Run Code Online (Sandbox Code Playgroud)

基本上我将所有小部件项目收集到一个地图中,其中关键字是availableStock数量,值是具有该数量的所有小部件的列表(因为多个小部件可能具有相同的值).有了这张地图后,我想选择与最小键对应的地图值.创建Map的中间步骤不是必需的,这是我能想到的唯一方法.

java java-8 java-stream

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

Java Streams:将两个集合组合到一个映射中

我有两个集合,一个仓库ID列表和一组小部件.小部件存在于不同数量的多个仓库中:

List<Long> warehouseIds;
List<Widget> widgets;
Run Code Online (Sandbox Code Playgroud)

这是一个类的定义示例:

public class Widget {
    public Collection<Stock> getStocks();
}

public class Stock {
    public Long getWarehouseId();
    public Integer getQuantity();
}
Run Code Online (Sandbox Code Playgroud)

我想使用Streams API创建一个Map,其中仓库ID是密钥,值是特定仓库中数量最小的Widgets列表.因为多个小部件可以具有相同的数量,所以我们返回一个列表.

例如,仓库111具有5数量的微件,5窗口小部件乙,和8窗口小部件Ç.

仓库222具有0数量的微件,5窗口小部件乙,和5窗口小部件Ç 的地图返回将具有以下项:

111 => ['WidgetA', 'WidgetB']

222 => ['WidgetA']

使用键开始设置Map似乎很容易,但我不知道如何构建下游缩减:

warehouseIds.stream().collect(Collectors.groupingBy(
    Function::Identity,
    HashMap::new,
    ???...
Run Code Online (Sandbox Code Playgroud)

我认为我遇到的问题是根据库存仓库ID减少小部件,而不知道如何返回收集器来创建小部件列表.以下是我目前如何获得特定仓库中库存最小的小部件列表(由someWarehouseId表示):

widgets.stream().collect(Collectors.groupingBy(
    (Widget w)->
        w.getStocks()
        //for a specific warehouse
        .stream().filter(stock->stock.getWarehouseId()==someWarehouseId) …
Run Code Online (Sandbox Code Playgroud)

java java-8 java-stream

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

"无法自动装配.没有类型的豆类......找到了"简单项目

我下载了简单的JPA Spring Boot教程,它运行得很好.但是,当我尝试在我自己的测试项目中复制这个简单的行为时,我在我的Application.demo()方法中的bean注入中得到一个"无法自动装配"错误,该方法返回一个CommandLineRunner.该项目是如此准确,我甚至不知道提交什么,但这里是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>

    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>test</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>
Run Code Online (Sandbox Code Playgroud)

和申请.

package com.example;

@SpringBootApplication
public class TestApplication {

    public static void main(String[] args) { …
Run Code Online (Sandbox Code Playgroud)

java spring maven spring-data-jpa

6
推荐指数
1
解决办法
3万
查看次数

使用Spring进行基于API的Web应用程序身份验证的双边方法

我正在创建一个将处理敏感数据的Web应用程序.该应用程序是作为Spring Boot RESTful API实现的,因此可以围绕它创建不同的灵活客户端.现在,计划中的消费者是一个Web客户端,其次是本机Android和iOs客户端.

我正在考虑以下方法来保护将处理敏感数据的WebApp:http: //www.redotheweb.com/2015/11/09/api-security.html

让我总结一下本文中概述的方法:

  1. 基于浏览器的客户端有两种安全方法:会话cookie和保存在本地存储中的临时令牌.
  2. 会话cookie易受CSRF攻击,而临时令牌易受XSS攻击.
  3. 解决方案是使用两者,因为它可以大大降低两种攻击的风险.

我的一部分感觉这种方法有点矫枉过正,但我​​正在开发一个可能需要考虑将来HIPAA合规性的应用程序,所以在这种情况下我觉得更多.

问题:

  1. 这是此类安全配置的"行业标准"方法吗?我看到这是在一年前发布的,我不确定是否已经进行了更新.此外,这种方法有名称吗?

  2. 这种类型的安全配置是否可用于Spring Boot的OOTB?

  3. 这样的方法如何转化为非浏览器消费者(例如Android应用程序)?此时避免使用本地存储,因此我们不需要使用会话cookie,但我们是否可以将Spring配置为对本机客户端使用特定规则?

security authentication rest spring

6
推荐指数
0
解决办法
236
查看次数

亚马逊MWS API:我们下载订单时缺少一些订单

我已经实施了一个系统来下载亚马逊卖家的订单.系统的工作方式如下:

  • 我们开始想要从中午12:00到下午2:00下载订单,所以我告诉亚马逊(通过他们的Java客户端):"从12:02到2:00给我所有订单(两分钟的时差是为了适应待定亚马逊在他们的API中描述的订单).
  • 我们完全下载了这些订单:如果有超过一百个我们使用下一个令牌,一旦我们拥有它们,我们就在每个订单上使用listOrderItems操作来获取订单项.

其中一些订单待定,如果是,我们将它们存储在我们的数据库中,并在下次检查它们是否可以下载.我们的下一个工作将在接下来的两个小时间隔内运行,要求所有订单从2:00到3:58.

此操作运行正常,但我们的客户开始报告他们的订单丢失.显然,时不时的订单会滑过众所周知的裂缝,我们不确定为什么.为了解决这个问题,我们设置了30分钟的重叠时间,这样每次下载订单时我们都会看到过去30分钟.除了下载冗余订单的代价之外,我们还要检查数据库以查看订单是否已经处理过,因此它会减慢速度.

在伤口擦盐,仍然没有解决问题!它不会经常发生,但平均每天有0-4个订单丢失.

java amazon-mws

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

RestTemplate ClientHttpResponse.getBody()抛出I/O错误

我正在使用Spring RestTemplate进行RESTful调用.我还使用自定义ClientHttpRequestInterceptor来记录请求和响应以进行调试.

为了多次读取响应(一次用于记录,一次用于处理),我使用BufferingClientHttpRequestFactory.这是设置:

ClientHttpRequestInterceptor ri = new LoggingRequestInterceptor();
List<ClientHttpRequestInterceptor> ris = new ArrayList<ClientHttpRequestInterceptor>();
ris.add(ri);
restTemplate.setInterceptors(ris);
restTemplate.setRequestFactory(new InterceptingClientHttpRequestFactory(
        new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()) , ris));
Run Code Online (Sandbox Code Playgroud)

我现在正在针对返回422响应并且遇到问题的请求测试此系统.从我的自定义ClientHttpRequestInterceptor的拦截方法中:

ClientHttpResponse response = execution.execute(request, body);
if(response.getBody() != null) {
    logger.trace(IOUtils.toString(response.getBody(), "UTF-8"));
}
Run Code Online (Sandbox Code Playgroud)

response.getBody()抛出异常:

org.springframework.web.client.ResourceAccessException:I/O错误:服务器返回HTTP响应代码:422为URL:https: //testurl.com/admin/orders/564/fulfill.json ; 嵌套异常是java.io.IOException:服务器返回HTTP响应代码:422为URL: https ://testurl.com/admin/orders/564/fulfill.json at org.springframework.web.client.RestTemplate.doExecute(RestTemplate .java:461)〜[spring-web-3.1.2.RELEASE.jar:3.1.2.RELEASE] org.springframework.web.client.RestTemplate.execute(RestTemplate.java:409)〜[spring-web- 3.1.2.RELEASE.jar:3.1.2.RELEASE]

不知道为什么会发生这种情况,但是我打开了调试器并为request.getBody()设置了一个监视表达式.在获取到我的实际代码之前,在该上下文中调用request.getBody()可以修复错误.

java spring resttemplate

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

将 XJC 与 xml.xsd 导入一起使用时出错:“无法读取架构文档 'xml.xsd'”

我正在尝试在第三方的架构文件(它是 Amazon.com 的产品 API)上运行 xjc。好吧,我遇到了麻烦,因为对于其中一个文件 default.xsd,xjc 正在执行以下导入(这是模式声明之后的第一个):

<import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd" />
Run Code Online (Sandbox Code Playgroud)

我不是 XML 专家,但我认为 xml.xsd 是“核心”XML/XSD 库的一部分,默认情况下 XJC 会知道这个库的详细信息。但是当我运行任务时,我收到此错误:

[警告] schema_reference.4:无法读取架构文档“xml.xsd”,因为 1) 找不到该文档;2) 无法读取文件;3) 文档的根元素不是 。文件的第 9 行:/C:/temp/amazon/default.xsd

[错误] src-resolve:无法将名称“xml:lang”解析为 (n)“属性声明”组件。文件的第 119 行:/C:/temp/amazon/default.xsd

我尝试将 xml.xsd 文件从http://www.w3.org/2001/03/xml.xsd下载到包含这些架构文件的目录并再次运行该命令,但 xml.xsd 未验证:

[ERROR] schema_reference.4:无法读取架构文档“file:/C:/temp/amazon/xml.xsd”,因为 1) 找不到文档;2) 无法读取文件;3) 文档的根元素不是 。未知地点

我正要开始思考为什么这不会得到验证,但决定推迟,因为我认为我错过了一些非常简单或很小的东西。我需要手动包含 xml.xsd 导入还是我缺少其他东西?

我正在使用的架构的网址目前在这里:

http://g-ecx.images-amazon.com/images/G/01/mwsportal/doc/en_US/products/default.xsd

和这里

http://g-ecx.images-amazon.com/images/G/01/mwsportal/doc/en_US/products/ProductsAPI_Response.xsd

我只是在使用:

xjc dirname 一起或 xjc filename 尝试一一解析它们

java xml xsd jaxb

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

Java 8-按集合映射的多个组

我正在尝试使用Java流对一个对象的两个属性进行分组.这很容易,正如一些答案所记录的那样:

products.stream().collect(
        Collectors.groupingBy(Product::getUpc, 
        Collectors.groupingBy(Product::getChannelIdentifier)));
Run Code Online (Sandbox Code Playgroud)

例如,上面的代码片段将在表单中生成地图地图

Map<String, Map<String, List<Product>>>
Run Code Online (Sandbox Code Playgroud)

如果地图具有UPC代码的键,则其值是具有引用产品列表的通道标识符的键的映射.

这很酷,但是如果我不需要嵌套值作为地图呢?也就是说,我想通过ChannelIdentifier组织嵌套集合,但我只关心地图的.values(),而不是地图本身.有没有办法得到符合以下条件的结果?

Map<String, List<List<Product>>
Run Code Online (Sandbox Code Playgroud)

列表或集合......没关系.谢谢!

java-8 java-stream

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

Spring Batch Step 不执行

我正在尝试解决 Spring Batch 中最近困扰我们系统的问题。我们有一份工作,大部分工作都很好。这是一个多步骤的工作,下载和处理数据。

问题是有时工作会爆炸。也许我们尝试连接的服务器抛出错误,或者我们在工作中关闭了服务器。此时,下次我们的石英调度程序尝试运行该作业时,它似乎什么也没做。以下是此作业定义的简化版本:

<batch:job id="job.download-stuff" restartable="true">
<batch:validator ref="downloadValidator"/>
<batch:step id="job.download-stuff.download">
    <batch:tasklet ref="salesChannelOrderDownloader" transaction-manager="transactionManager">
        <batch:transaction-attributes isolation="READ_UNCOMMITTED" propagation="NOT_SUPPORTED"/>
        <batch:listeners>
            <batch:listener ref="downloadListener"/>
            <batch:listener ref="loggingContextStepListener" />
        </batch:listeners>
    </batch:tasklet>
    <batch:next on="CONTINUE" to="job.download-stuff.process-stuff.step" />
    <batch:end on="*" />
</batch:step>
<batch:step id="job.download-stuff.process-stuff.step">
    ...
</batch:step>
<batch:listeners>
    <batch:listener ref="loggingContextJobListener"/>
</batch:listeners>
Run Code Online (Sandbox Code Playgroud)

一旦进入这种状态,就会downloadValidator运行,但它永远不会进入第一步download-stuff.download。我在 tasklet 中设置了一个断点,但它永远不会进入。

如果我清除存储在我们的 mysql 数据库中的所有 spring 批处理表,并重新启动服务器,它将再次开始工作,但我宁愿了解是什么阻止它此时无法正常运行,而不是采用焦土策略使工作运行。

我是 Spring Batch 的新手,说得客气一点,所以如果我省略了重要的细节,请原谅我。我已经设置了断点并打开了日志记录以了解我所能做的。

到目前为止,我通过数据库观察到的条目似乎不再写入 BATCH_STEP_EXECUTION 和 BATCH_JOB_EXECUTION 表。

没有未处于 COMPLETED 状态的作业的 BATCH_JOB_EXECUTION 条目,也没有未处于 COMPLETED 状态的 BATCH_STEP_EXECUTION 条目

您会看到定义了一个 batch:validator,我已经确认 spring batch 调用该验证器并且它成功通过(设置断点并逐步通过)。第一步不执行。

loggingContextJobListener …

spring spring-batch

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

Android Lambdas的NoSuchMethodError

我正在寻求在我的Android项目中使用Lambda表达式(min sdk:16,target sdk:25),但遇到了很多问题.

第一个问题是我正在使用模拟器开发和调试我的应用程序,多次部署和修复错误,当突然显示应用程序将完全停止加载时.

我在日志中得到以下stacktrace:

java.lang.NoSuchMethodError:没有直接方法(Ljava/lang/Object;)类Lcom/androidtest/ - $ Lambda $ 1; 或其超级类('com.androidtest .- $ Lambda $ 1'的声明出现在/data/app/com.androidtest-2/base.apk中)

我在我的app/build.gradle文件中使用以下代码启用了android文档中描述的lambda表达式:

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.gfs.mp3lab"
        minSdkVersion 16
        targetSdkVersion 25
        ...
    }
    ...

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}
Run Code Online (Sandbox Code Playgroud)

我接受了Parth Pandya的建议,并在我的build.gradle文件中添加了jackOptions参数,并认为可以解决问题,但在重建我的项目之后,我现在在公平地得到一个不同的错误:

java.lang.IncompatibleClassChangeError:Class'com.gfs.jotsalot .- $ Lambda $ 1'在调用'void java.lang.Runnable.run()'时没有实现接口'java.lang.Runnable'('android的声明' .os.Handler'出现在/system/framework/framework.jar)android.os.Handler.handleCallback(Handler.java:751)android.os.Handler.dispatchMessage(Handler.java:95)

替换lambda表达式似乎可以解决问题,所以从

() -> { Log.i(TAG, "Hey There"); }

new Runnable() {
    @Override
    public void run() {
        Log.i(TAG, "Hey There");
    }
}
Run Code Online (Sandbox Code Playgroud)

作品.我在一个线程应用程序中这样做,所以我不确定这是否是错误的原因,到目前为止我只在模拟器上尝试过.重建项目可以解决问题,但这非常耗费时间,而且麻烦对于我从项目中删除所有这些内容一直是​​有害的.

到目前为止,我只在模拟器内部进行了测试,并且不确定它是否会影响真正的手机环境.因为这些lambda表达式工作正常(直到它们没有),我认为可以安全地断定这是一个bug.我只是想知道它是否是一个已知的,如果它有任何变通方法.

lambda android

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