小编Oli*_*ich的帖子

在抽象超类中定义spring @EventListener

我盯着使用spring的@EventListener注释来创建处理我的非春季特定事件的事件处理程序.最初一切都很顺利.我使用测试来验证我可以将@EventListener注释放在抽象类的方法上,一切都按预期工作.

然而,一旦我开始添加泛型,我就开始NullPointerExceptions从中获取ApplicationListenerMethodAdapter.java:337.

我已经创建了一个测试用例来说明问题.目前所有测试方法都失败,例外情况如下:

java.lang.NullPointerException
at java.lang.Class.isAssignableFrom(Native Method)
at org.springframework.context.event.ApplicationListenerMethodAdapter.getResolvableType(ApplicationListenerMethodAdapter.java:337)
at org.springframework.context.event.ApplicationListenerMethodAdapter.resolveArguments(ApplicationListenerMethodAdapter.java:161)
at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:142)
at org.springframework.context.event.ApplicationListenerMethodAdapter.onApplicationEvent(ApplicationListenerMethodAdapter.java:106)
at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:163)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:136)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:381)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:348)
Run Code Online (Sandbox Code Playgroud)

当我将@EventListener注释向下移动到每个具体的侦听器时,异常消失,并且事物的行为与预期的一样,但是除外testSendingEventWithGenericsWithExtendedUniquePayload.

问题

Q1)使用@EventListener抽象超类的方法是一种有效的使用模式吗?我希望在那里实施共同的行为.

Q2)我读到了关于ResolvableTypeProvider在春季文档中实现我的活动的内容.我的理解是,这将允许我避免为每个有效负载类型创建许多具体的子类.这就是我试图测试的内容testSendingEventWithGenericsWithExtendedUniquePayload.我期待在这个测试中被触发的事件被处理,TestEventWithGenericsExtendedUniquePayloadListener但事实并非如此.我在这里误解了什么吗?

Spring:4.2.4.RELEASE Java:1.8.0_65

谢谢你的帮助奥利弗

测试代码

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.EventListener;
import org.springframework.core.ResolvableType;
import org.springframework.core.ResolvableTypeProvider;
import org.springframework.stereotype.Component;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.context.ContextConfiguration;
import …
Run Code Online (Sandbox Code Playgroud)

java generics spring

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

Spring Data Elasticsearch (4.x) - 在 _source 中使用 @Id 强制 id 字段

概括

最近我们升级到 Spring Data Elasticsearch 4.x。这个主要版本的一部分意味着不再使用 Jackson 将我们的域对象转换为 json(MappingElasticsearchConverter改为使用)[1]。这意味着我们现在被迫id向所有文档添加一个新字段。

以前我们有这样的域对象:

import org.springframework.data.annotation.Id;

public ESDocument {
    @Id
    private String id;

    private String field1;

    @JsonIgnore
    public String getId() {
        return id;
    }

    public String getField1() {
        return field1;
    }
Run Code Online (Sandbox Code Playgroud)

这导致在 ES 中出现这样的文档:

{
  "_index" : "test_index",
  "_type" : "_doc",
  "_id" : "d5bf7b5c-7a44-42f9-94d6-d59fe3988482",
  "_score" : 1.0,
  "_source" : {
    "field1" : "blabla"
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:

  1. @JsonIgnore注释用来确保我们要求有一个id在外地_source
  2. 我们自己设置文档 ID,它以_id.

问题 …

java elasticsearch spring-data spring-boot spring-data-elasticsearch

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

使用 TextIO 和 ValueProvider 创建数据流模板时出错

我正在尝试创建一个谷歌数据流模板,但我似乎找不到一种方法来做到这一点而不产生以下异常:

WARNING: Size estimation of the source failed: RuntimeValueProvider{propertyName=inputFile, default=null}
java.lang.IllegalStateException: Value only available at runtime, but accessed from a non-runtime context: RuntimeValueProvider{propertyName=inputFile, default=null}
        at org.apache.beam.sdk.options.ValueProvider$RuntimeValueProvider.get(ValueProvider.java:234)
        at org.apache.beam.sdk.io.FileBasedSource.getEstimatedSizeBytes(FileBasedSource.java:218)
        at org.apache.beam.runners.dataflow.internal.CustomSources.serializeToCloudSource(CustomSources.java:78)
        at org.apache.beam.runners.dataflow.ReadTranslator.translateReadHelper(ReadTranslator.java:53)
        at org.apache.beam.runners.dataflow.ReadTranslator.translate(ReadTranslator.java:40)
        at org.apache.beam.runners.dataflow.ReadTranslator.translate(ReadTranslator.java:37)
        at org.apache.beam.runners.dataflow.DataflowPipelineTranslator$Translator.visitPrimitiveTransform(DataflowPipelineTranslator.java:453)
        at org.apache.beam.sdk.runners.TransformHierarchy$Node.visit(TransformHierarchy.java:668)
        at org.apache.beam.sdk.runners.TransformHierarchy$Node.visit(TransformHierarchy.java:660)
        at org.apache.beam.sdk.runners.TransformHierarchy$Node.visit(TransformHierarchy.java:660)
        at org.apache.beam.sdk.runners.TransformHierarchy$Node.access$600(TransformHierarchy.java:311)
        at org.apache.beam.sdk.runners.TransformHierarchy.visit(TransformHierarchy.java:245)
        at org.apache.beam.sdk.Pipeline.traverseTopologically(Pipeline.java:458)
        at org.apache.beam.runners.dataflow.DataflowPipelineTranslator$Translator.translate(DataflowPipelineTranslator.java:392)
        at org.apache.beam.runners.dataflow.DataflowPipelineTranslator.translate(DataflowPipelineTranslator.java:170)
        at org.apache.beam.runners.dataflow.DataflowRunner.run(DataflowRunner.java:680)
        at org.apache.beam.runners.dataflow.DataflowRunner.run(DataflowRunner.java:174)
        at org.apache.beam.sdk.Pipeline.run(Pipeline.java:311)
        at org.apache.beam.sdk.Pipeline.run(Pipeline.java:297)
        at org.apache.beam.examples.MyMinimalWordCount.main(MyMinimalWordCount.java:69)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:282)
        at java.lang.Thread.run(Thread.java:748)
Run Code Online (Sandbox Code Playgroud)

我可以使用 Beam 的 …

java google-cloud-dataflow apache-beam apache-beam-io

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