小编Jur*_*uru的帖子

泛型方法的泛型返回类型

考虑这样的通用方法定义:

public static <T> T getParameter(final Context context, final ContextParameter contextParameter, final Class<T> clazz) {
    return (T) context.get(contextParameter.name());
}
Run Code Online (Sandbox Code Playgroud)

在尝试像List <String>这样的通用对象之前,可以完美地获取任何类型的对象.我能使它工作的唯一方法是这样的:

 final List<String> fileNames = 
             (List<String>) ContextUtils.getParameter(context,
                             ContextParameter.EOF_FILE_NAMES_TO_ZIP, List.class);
Run Code Online (Sandbox Code Playgroud)

但这需要额外的演员阵容,从而消除了使用该方法的目的.有没有办法提供List<String>.class或类似的方法?(我知道类型擦除可以防止List<String>存在,但也许有办法做到这一点).

注意:使其工作我的意思是没有类型安全警告.我知道代码可以正常工作,但它不是类型安全的.

java generics type-erasure

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

溪流如何停止?

我想知道我何时创建自己的无限流,Stream.generate标准库中的Streams如何停止...

例如,当您有一个包含记录的列表时:

List<Record> records = getListWithRecords();
records.stream().forEach(/* do something */);
Run Code Online (Sandbox Code Playgroud)

流不会无限并且永远运行,但是当遍历列表中的所有项时它将停止.但是这有什么作用呢?相同的功能适用于由Files.lines(path)(源:http://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/)创建的流.

第二个问题,如何Stream.generate以相同的方式停止创建流?

infinite java-8 java-stream

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

使用JPA进行事务边界和DTO转换

我一直想知道应该如何处理这种异常现象:

  1. DTO应该在控制器中转换,服务层不需要知道它们.
  2. 事务边界由服务层定义.

但是,如何避免JPA LazyInitialization异常呢?DTO转换可能需要Lazy Fetched数据,但由于服务层处理了事务,因此无法进行转换.

有一些我能想到的方法,但都是丑陋的.将DTO转换放在服务层中对我来说似乎是最好的.

java jpa transactions dto lazy-initialization

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

多个枚举与一个枚举

当我偶然发现一些我不明白为什么这样做的事情时,我正在查看反应流规范的Publisher(AsyncIterablePublisher.java)的示例实现.

static interface Signal {};
enum Cancel implements Signal { Instance; };
enum Subscribe implements Signal { Instance; };
enum Send implements Signal { Instance; };
Run Code Online (Sandbox Code Playgroud)

说实话,我不是这样一个高级程序员,而是写这篇文章的人,我确信有理由这样做.但是我也无法解释为什么它会比这更好(这就是我会这样做的).

enum Signal {
  Cancel,
  Subscribe,
  Send;
}
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释为什么会更好吗?优点缺点?

java enums reactive-streams

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

关于面向块的步骤与现实的Spring Batch文档?

在用于配置步骤的Spring Batch 文档中,清晰的图片描述了如何执行读取过程和写入.

read
process
...
read
process
// until #amountOfReadsAndProcesses = commit interval
write
Run Code Online (Sandbox Code Playgroud)

对应(根据文件):

List items = new Arraylist();
for(int i = 0; i < commitInterval; i++){
    Object item = itemReader.read()
    Object processedItem = itemProcessor.process(item);
    items.add(processedItem);
}
itemWriter.write(items);
Run Code Online (Sandbox Code Playgroud)

但是,当我在读取器的read方法中调试并设置断点并在处理器的process方法中设置断点时,我看到以下行为:

read
...
read
// until #amountOfReads = commit interval
process
...
process
// until #amountOfProcesses = commit interval
write
Run Code Online (Sandbox Code Playgroud)

那么文档错了吗?或者我错过了一些配置,使其行为像文档(没有找到任何东西).

我遇到的问题是每个后续读取现在取决于处理器的状态.读取器是并行读取两个源的复合,取决于其中一个源中的读取项,在一次读取操作期间仅读取第一个,第二个或两个源.但是要在处理器中进行读取的源的状态.目前唯一的解决方案是使用commit-interval 1,这对于性能来说不是最佳的.

spring-batch

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

流处理同时依赖上一个和下一个元素

我必须处理一个包含预定义记录布局的固定宽度文件,存在多种类型的记录,并且记录的第一个字符决定了它的类型。因为它是固定宽度,所以在一行中并不总是可以容纳整个记录类型,所以第二个字符是记录的序列号。例如:

0This is the header record------------------------------------
1This is another record always existing out of one lin--------
21This is a record that can be composed out of multiple parts.
22This is the second part of record type 2--------------------
21This is a new record of type 2, first part.-----------------
22This is the second part of record type 2--------------------
23This is the third part of record type 2---------------------
...
Run Code Online (Sandbox Code Playgroud)

使用 Stream API,我想解析这个文件:

Stream<String> lines = Files.lines(Paths.get(args[1]));

lines.map(line -> RecordFactory.createRecord(line)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

但是由于这个流是逐行传递的,当它解析记录类型 2 的第一行(记录类型 2 …

java lambda java-8 java-stream

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

StaxEventItemReader中的Jaxb2Marshaller导致UnmarshalException

所以我试图解析一个xml并将其解组成一个程序.这是xml的示例:

<MaintenanceTransaction:provideCommunicationEvents_BatchRequest
        xmlns:MaintenanceTransaction="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <MaintenanceTransaction:maintenanceTransaction>
        <MaintenanceTransaction:eventInitiatedBy>
            <MaintenanceTransaction:identifier>FINACLE</MaintenanceTransaction:identifier>
        </MaintenanceTransaction:eventInitiatedBy>
        <MaintenanceTransaction:transactionDate>2014-06-21T19:00:32.356+01:00</MaintenanceTransaction:transactionDate>
        <MaintenanceTransaction:maintenanceTransactionType>PRE-NOTIFICATION
        </MaintenanceTransaction:maintenanceTransactionType>
        <MaintenanceTransaction:maintenanceEntries>
            <MaintenanceTransaction:hasNewValues xsi:type="MaintenanceTransaction:DepositArrangement">
                <MaintenanceTransaction:enterpriseId xsi:type="MaintenanceTransaction:ArrangementIdentifier">
                    <MaintenanceTransaction:identifier>222000000322</MaintenanceTransaction:identifier>
                    <MaintenanceTransaction:enterpriseIdType>Term Deposit</MaintenanceTransaction:enterpriseIdType>
                </MaintenanceTransaction:enterpriseId>
                <MaintenanceTransaction:maturityDate>2014-10-08</MaintenanceTransaction:maturityDate>
            </MaintenanceTransaction:hasNewValues>
        </MaintenanceTransaction:maintenanceEntries>
    </MaintenanceTransaction:maintenanceTransaction>
</MaintenanceTransaction:provideCommunicationEvents_BatchRequest>
Run Code Online (Sandbox Code Playgroud)

xsd定义为:

<xsd:schema xmlns:MaintenanceTransaction="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.pwx.com/Interface/CRS/MaintenanceTransaction_v02" elementFormDefault="qualified" attributeFormDefault="qualified">
    <xsd:include schemaLocation="./commonIFWxsd/IFWXML.xsd" />
    <xsd:include schemaLocation="./commonIFWxsd/Event.xsd" />
    <xsd:include schemaLocation="./commonIFWxsd/Arrangement.xsd" />
    <!-- end of TYPES REQUIRED FOR PARAMETERS -->
    <xsd:complexType name="provideCommunicationEvents_BatchRequest">
        <xsd:sequence>
            <xsd:element name="maintenanceTransaction" type="MaintenanceTransaction:MaintenanceTransaction" maxOccurs="unbounded" />
        </xsd:sequence>
    </xsd:complexType>
    <!-- TYPES REQUIRED FOR PARAMETERS -->
    <xsd:element name="provideCommunicationEvents_BatchRequest" type="MaintenanceTransaction:provideCommunicationEvents_BatchRequest" />
</xsd:schema>
Run Code Online (Sandbox Code Playgroud)

使用我的StaxEventItemReader和Jaxb2Marshaller的以下设置:

<bean id="uploadEventMessageReader" parent="abstractUploadEventMessageReader" scope="step">
    <property name="resource" value="file:#{jobExecutionContext['fileToProcess']}"/>
    <property name="fragmentRootElementName" …
Run Code Online (Sandbox Code Playgroud)

stax jaxb spring-batch

3
推荐指数
2
解决办法
1857
查看次数