我很确定这在一行中是不可能的,但我只是想检查一下:
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的中间步骤不是必需的,这是我能想到的唯一方法.
我有两个集合,一个仓库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) 我下载了简单的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) 我正在创建一个将处理敏感数据的Web应用程序.该应用程序是作为Spring Boot RESTful API实现的,因此可以围绕它创建不同的灵活客户端.现在,计划中的消费者是一个Web客户端,其次是本机Android和iOs客户端.
我正在考虑以下方法来保护将处理敏感数据的WebApp:http: //www.redotheweb.com/2015/11/09/api-security.html
让我总结一下本文中概述的方法:
我的一部分感觉这种方法有点矫枉过正,但我正在开发一个可能需要考虑将来HIPAA合规性的应用程序,所以在这种情况下我觉得更多.
问题:
这是此类安全配置的"行业标准"方法吗?我看到这是在一年前发布的,我不确定是否已经进行了更新.此外,这种方法有名称吗?
这种类型的安全配置是否可用于Spring Boot的OOTB?
这样的方法如何转化为非浏览器消费者(例如Android应用程序)?此时避免使用本地存储,因此我们不需要使用会话cookie,但我们是否可以将Spring配置为对本机客户端使用特定规则?
我已经实施了一个系统来下载亚马逊卖家的订单.系统的工作方式如下:
其中一些订单待定,如果是,我们将它们存储在我们的数据库中,并在下次检查它们是否可以下载.我们的下一个工作将在接下来的两个小时间隔内运行,要求所有订单从2:00到3:58.
此操作运行正常,但我们的客户开始报告他们的订单丢失.显然,时不时的订单会滑过众所周知的裂缝,我们不确定为什么.为了解决这个问题,我们设置了30分钟的重叠时间,这样每次下载订单时我们都会看到过去30分钟.除了下载冗余订单的代价之外,我们还要检查数据库以查看订单是否已经处理过,因此它会减慢速度.
而在伤口擦盐,仍然没有解决问题!它不会经常发生,但平均每天有0-4个订单丢失.
我正在使用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()可以修复错误.
我正在尝试在第三方的架构文件(它是 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流对一个对象的两个属性进行分组.这很容易,正如一些答案所记录的那样:
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)
列表或集合......没关系.谢谢!
我正在尝试解决 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 …
我正在寻求在我的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.我只是想知道它是否是一个已知的,如果它有任何变通方法.
java ×6
spring ×4
java-8 ×3
java-stream ×3
amazon-mws ×1
android ×1
jaxb ×1
lambda ×1
maven ×1
rest ×1
resttemplate ×1
security ×1
spring-batch ×1
xml ×1
xsd ×1