小编C-O*_*tto的帖子

JPA/EclipseLink:了解ClassLoader问题

编辑:虽然给出并给出了一个(好的)答案,但这只涉及我的问题中一个相当不重要的部分.这个问题的主要部分仍然是开放的.

我在云项目中使用EclipseLink(2.6.2).该项目是一个打包为WAR文件并部署在Apache Tomcat 8上的Web应用程序.持久化上下文是使用Java代码设置的,我在其中指定要使用的实体entityManagerFactoryBean.setPackagesToScan(packagesToScan).此配置通常按预期工作,其中确切地找到指定包中的实体类.

我现在无法理解何时使用哪个类加载器,尤其是在考虑Tomcat,运行测试和使用不同的连接池实现时.

在包含Tomcat连接池的Apache Tomcat上运行时,DataSource使用spring-cloud-connectorplugin(spring-cloud-spring-service-connector)创建实例.在这个设置中,一切都按预期工作,只要我不改变下面描述的类加载器(否则我面对ClassNotFoundException实体类).

当的帮助下运行单元测试JUnitspring-testDataSource实例使用的内存数据库H2(使用创建EmbeddedDatabaseBuilderspring-jdbc).在此设置中,我必须指定JPA以使用用于DataSource实例的类加载器(eclipselink.classloaderJPA属性映射中的键),否则我得到"对象...不是已知的实体类型".

在嵌入式Apache Tomcat 8中运行测试时,我看不到任何指示正在使用的连接池的消息.在这个设置中,我还必须为单元测试设置类加载器.

如果我将commons-dbcp(2.1.1)添加到我的项目并显式配置spring-cloud-connector插件以使用它而不是Tomcat的连接池,我可以在Tomcat上运行应用程序而无需配置类加载器,但它也适用于上述类加载器规范.

对于测试,commons-dbcp与上面概述的情况相比,没有任何改变(因为没有使用相应的配置).

摘要:

  • Tomcat(Tomcat CP):仅对JPA使用未修改的类加载器
  • Tomcat(DBCP):两种变体
  • 测试:仅使用DataSourceJPA的类加载器

你能帮我理解这里的不同之处,并建议一个适合所有情况的简单解决方案吗?我假设DBCP和Spring使用与Tomcat(和Tomcat的连接池)不同的类加载器.

如果您需要更多信息,我很乐意添加它.

编辑:我添加了一个示例项目,其中包含有关如何重现的大型自述文件.

https://github.com/C-Otto/classloaderexample

java jpa classloader eclipselink apache-commons-dbcp

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

将String转换为Object时调用toString()

这是我的示例代码:

String str = "hello";
Object obj = (Object)str;
System.out.println(obj.toString());
Run Code Online (Sandbox Code Playgroud)

我找到了Object的源代码,toString()方法是:

public String toString() {   
   return getClass().getName() + "@" + Integer.toHexString(hashCode());
} 
Run Code Online (Sandbox Code Playgroud)

我认为这个例子的结果是这个Object的地址,比如[B @ 15db9742,在我将str转换为Object之后,但它仍然打印你好.为什么?Shound not obj使用Object的方法?任何人都可以向我解释它的原理吗?

java

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

Spring Kafka:轮询新消息而不是使用 `onMessage` 通知

我在我的项目中使用 Spring Kafka,因为在基于 Spring 的项目中使用 Kafka 消息似乎是一个自然的选择。要消费消息,我可以使用该MessageListener接口。Spring Kafka 在内部负责onMessage为每条新消息调用我的方法。

但是,在我的设置中,我更喜欢显式轮询新消息并按顺序处理它们(这将需要几秒钟)。作为一种解决方法,我可能只是在我的onMessage实现中阻塞,或者在内部缓冲消息。然而,这似乎与 Spring Kafka 的核心思想背道而驰。

Kafka 的设计使消费者必须轮询符合我要求的新消息。有没有办法在 Spring Kafka 中使用这种“自然”的工作流程?

对于这个用例,我应该避免使用 Spring Kafka 吗?

KafkaConsumer文件指出:

对于消息处理时间变化不可预测的用例,这些选项都可能不够。处理这些情况的推荐方法是将消息处理移动到另一个线程,这允许消费者在处理器仍在工作时继续调用 poll。必须注意确保提交的偏移量不会超过实际位置。通常,您必须禁用自动提交并仅在线程完成处理记录后手动提交记录的处理偏移量(取决于您需要的交付语义)。另请注意,您需要暂停分区,以便在线程完成处理先前返回的记录之前不会从轮询接收新记录。

相关问题:https : //github.com/spring-projects/spring-kafka/issues/195

spring apache-kafka kafka-consumer-api spring-kafka

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

NullPointerException 在抽象类的实现中的 Autowired 对象上

我的代码有一个奇怪的问题。我已经实现了template method pattern提供相同算法的不同实现。所以我创建了抽象类:

@Service
public abstract class ExcelRdi_Iupr_Sl {
    @Autowired
    private Environment env;

    private static String PROPERTY_NAME_FILESYSTEM_EXCELPATH = "temporary.excelpath";
    private XSSFWorkbook workbook; 
    private XSSFCellStyle unlockedNumericStyle;
    private XSSFSheet sheet;

    /**
     * Create the excel file with the RDI,IUPR or SL
     * @param car
     * @param fileName
     * @return
     * @throws Exception
     */
    public final String retrieve(Car car, String fileName) throws Exception{
        writeInitialize();
        Map<Integer,Integer> defMap = firstTwoRow(car, sheet);
        elaboration(car, sheet, unlockedNumericStyle, defMap);
        return writeFile(car, fileName);
    }

    /**
     * Import the …
Run Code Online (Sandbox Code Playgroud)

java spring design-patterns abstract autowired

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