小编Ben*_*rer的帖子

用QuerydslJpaPredicateExecutor替换不推荐使用的QuerydslJpaRepository失败

我需要一些启用了QueryDSL的自定义查询方法,并遵循此SO答案

效果很好,但是在升级到Spring Boot 2.1(升级了Spring Data)之后,我发现它QuerydslJpaRepository已被弃用。简单地将其替换为QuerydslJpaPredicateExecutor- 文档会告诉我使用-会导致错误:

引起原因:java.lang.IllegalArgumentException:类[... ProjectingQueryDslJpaRepositoryImpl]的对象必须是接口org.springframework.data.jpa.repository.support.JpaRepositoryImplementation的实例。

...但是实施JpaRepositoryImplementation将意味着我必须实施所有标准的CRUD方法,这显然是我所不希望的。因此,如果我repositoryBaseClass从中删除config @EnableJpaRepositories,以将其视为带有实现的存储库片段,则它将尝试实例化该片段,即使已将其标记为,也会@NoRepositoryBean出现错误:

原因:java.lang.IllegalArgumentException:无法创建方法公共抽象java.util.Optional ProjectingQueryDslJpaRepository.findOneProjectedBy(com.querydsl.core.types.Expression,com.querydsl.core.types.Predicate)的查询!提供至少1个参数,但查询中仅提供0个参数。

...

原因:java.lang.IllegalArgumentException:提供了至少1个参数,但查询中仅存在0个参数。

原始版本:

@Configuration
@EnableJpaRepositories(basePackageClasses = Application.class, repositoryBaseClass = ProjectingQueryDslJpaRepositoryImpl.class)
@EnableTransactionManagement
@EnableJpaAuditing
@RequiredArgsConstructor(onConstructor = @__({@Autowired}))
public class DatabaseConfig {}
Run Code Online (Sandbox Code Playgroud)

_

@NoRepositoryBean
public interface ProjectingQueryDslJpaRepository<T> extends QuerydslBinderCustomizer<EntityPath<T>>, QuerydslPredicateExecutor<T> {

    @NonNull
    <P> Page<P> findPageProjectedBy(@NonNull Expression<P> factoryExpression, Predicate predicate, 
            @NonNull Pageable pageable);

    @NonNull
    <P> Optional<P> findOneProjectedBy(@NonNull Expression<P> factoryExpression, @NonNull Predicate predicate);

    @Override
    default void customize(@NonNull QuerydslBindings bindings, …
Run Code Online (Sandbox Code Playgroud)

querydsl spring-data spring-data-jpa spring-boot

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

排序 QtTableModel - QTableView 没有更新

我实现了一个自定义QAbstractTableModel,并使用 astd::vector作为我的数据对象。

现在我想实现 sort() 方法,让我的表按列排序。这基本上就是我所做的:

void SBStateTableModel::sort (int column, Qt::SortOrder order)
{
emit layoutAboutToBeChanged();

switch (column)
{
case Address:
    if (order == Qt::DescendingOrder)
        std::sort(states.begin(), states.end(), addr_comp_desc);
    else
        std::sort(states.begin(), states.end(), addr_comp_asc);

default:
    return;
}

emit layoutChanged();
}
Run Code Online (Sandbox Code Playgroud)

layoutChanged()单独发出并不会重绘视图。当标记一行并循环浏览它们时,它们会在突出显示时更新。

该文档还谈到了更新持久索引。对此,有些人提出,其实没有必要。我什至不知道该怎么做。获取列表persistentIndexList(),然后我必须对其进行排序。但std::sort不是一个稳定的排序。我不确定如何将持久索引与我的向量索引相匹配。

编辑:“案件”中只缺少一个“中断”!因此该函数将在发出layoutChanged 信号之前返回。

c++ sorting qt model-view

4
推荐指数
1
解决办法
4551
查看次数

尽管'DB_CLOSE_ON_EXIT = FALSE',H2内存中测试数据库仍关闭

我有一些简短的单元测试,但失败了:

javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not prepare statement
::
Caused by: org.hibernate.exception.GenericJDBCException: could not prepare statement
::
Caused by: org.h2.jdbc.JdbcSQLException: Database is already closed (to disable automatic closing at VM shutdown, add ";DB_CLOSE_ON_EXIT=FALSE" to the db URL) [90121-197]
Run Code Online (Sandbox Code Playgroud)

来源是我的Spring Data AuditProvider,特别是以下行:

user = entityManager.createNamedQuery("findUserByUsernameAndTenant", User.class)
        .setParameter("tenant", TenantService.DEFAULT_TENANT_ID)
        .setParameter("username", UserService.USER_SYSTEM).getSingleResult();
Run Code Online (Sandbox Code Playgroud)

在执行整个测试套件时才发生错误,而在运行此测试类时才发生。

这是我正在使用的TestRunner等:

@RunWith(SpringRunner.class)
@SpringBootTest
@Transactional
@Rollback
public class MyTest {
Run Code Online (Sandbox Code Playgroud)

那是我的数据源URL:

spring.datasource.url: 'jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE'
Run Code Online (Sandbox Code Playgroud)

因此,看来“ DB_CLOSE_ON_EXIT”不能解决问题,知道这是怎么回事吗?

更新:

我刚刚意识到,只有在Eclipse中运行测试时才会发生这种情况,但是它们是在命令行中运行的。虽然我偶尔会得到:

o.s.b.f.support.DisposableBeanAdapter    : Invocation of destroy method failed on bean with …
Run Code Online (Sandbox Code Playgroud)

java junit spring h2 spring-boot

4
推荐指数
1
解决办法
4787
查看次数

Spring Boot:如何覆盖单元测试中的默认属性

我尝试为单元测试加载第二个属性文件,这会覆盖一些属性。

@PropertySource用a加载它@Configuration不起作用,用 a 加载它@TestPropertySource也不起作用。仅properties直接设置@TesPropertySource有效,但当我尝试将其变成元注释时它不起作用。

这是一个示例项目:https ://github.com/cptwunderlich/SpringTestProperties

我更喜欢加载一个文件来影响所有测试(例如 with @PropertySource),但如果这不起作用,至少有一个自定义元注释会很好,所以我不必将其放在每个测试上测试。基本上我不想一些数据导入到数据库中进行测试(spring.datasource.data),然后还更改使用的数据库 - 无需复制整个配置并且每次都必须在两个位置更改它。

重要的部分:

@RunWith(SpringRunner.class)
@SpringBootTest
@TestPropertySource(locations = "classpath:application-test.properties")
public class TestconfigApplicationTests {

    @Value("${my.test.property}")
    private String testproperty;

    @Test
    public void assertValue() {
        Assert.assertEquals("foobar", testproperty);
    }

}
Run Code Online (Sandbox Code Playgroud)

或者测试包中的配置类:

@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
@PropertySource("classpath:application-test.properties")
public class GlobalTestConfig {
}
Run Code Online (Sandbox Code Playgroud)

更新:

答案中的主要建议是使用@ActiveProfile激活“测​​试”配置文件,这将导致加载“application-test.yaml”。这比 更好@TestPropertySource,但我仍然需要在每个测试类上添加注释。我尝试创建一个元注释 - 它应该可以工作- 所以至少我只有一个自定义注释,我可以在其中捆绑其他设置。但这是行不通的。

完美的解决方案是使用一个配置类全局设置这些设置,而不必在每个测试上添加注释。我仍在寻找该解决方案,或者至少在关闭此问题之前调试元注释。编辑:我创建了一个 Jira 问题:SPR-17531

编辑

好吧,我有点困惑,所以我重新测试了所有不同的组合:

  • @TestPropertySource(locations = "classpath:application-test.properties") …

java spring unit-testing spring-boot spring-boot-test

4
推荐指数
1
解决办法
8383
查看次数

特定专业通用容器的功能

我正在尝试编写一个应该与包含相同类型的不同容器(std::vector、QVector)一起使用的算法:

template<class Container>
boolean findpeaks(cv::Mat &m, Container<std::pair<int, double>> &peaks) {
    // do stuff
    peaks.push_back(std::make_pair(1, 1.0));

    return true;
}
Run Code Online (Sandbox Code Playgroud)

这一个给了我

“容器”不是模板

template<template<typename> class Container>
Run Code Online (Sandbox Code Playgroud)

我得到:

错误:没有匹配的函数可用于调用“findpeaks(cv::MatExpr, std::vector >&)”

...

注意:模板参数推导/替换失败:

错误:模板参数数量错误(2,应该是 1)

调用代码:

cv::Mat m(data, true);
std::vector<std::pair<int, double>> peaks;

QVERIFY(daf::findpeaks(m.t(), peaks));
Run Code Online (Sandbox Code Playgroud)

我也尝试过这样的事情:

template<template< template<typename, typename> typename > class Container>
Run Code Online (Sandbox Code Playgroud)

警告:ISO C++ 禁止在模板模板参数中使用 typename 键;使用 -std=c++1z 或 -std=gnu++1z [-Wpedantic]

还有一些错误...

c++ templates vector generic-programming c++11

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

Cassava 无法识别带有 Umlaut 的命名字段

我正在尝试解析包含德语文本的 CSV 文件,即它不是用“逗号”分隔,而是用分号分隔,并且可能包含变音符号(\xc3\xa4\xc3\xb6\xc3\xbc 等)。

\n

使用Cassava并按照链接的教程进行操作,对于标题包含变音符号的列,我收到错误:

\n
\n

解析错误(读取失败:转换错误:在“\\nEUR;0,99”处没有名为“W\\228hrung”的字段)

\n
\n

再次:

\n
{-# LANGUAGE OverloadedStrings, TypeApplications #-}\n\nimport Data.Char\nimport qualified Data.ByteString.Lazy as ByteString\nimport Data.Csv\nimport Data.Text\n\nmyOpts = defaultDecodeOptions {\n      decDelimiter = fromIntegral (ord \';\')\n  }\n\ndata Transaction = Tx\n  { waehrung :: Text\n  , betrag :: Text\n  } deriving Show\n\ninstance FromNamedRecord Transaction where\n  parseNamedRecord m =\n    Tx\n      <$> m .: "W\xc3\xa4hrung"\n      <*> m .: "Betrag"\n\nmain :: IO ()\nmain =\n  ByteString.readFile "bank.csv"\n    >>= print . decodeByNameWith @Transaction myOpts\n
Run Code Online (Sandbox Code Playgroud)\n …

csv haskell

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

libnl-3包括破碎?

我想在Ubuntu下使用libnl 3(http://www.infradead.org/~tgr/libnl/)来使用netlink来从IPv6邻居缓存中获取一些信息.

我为这个lib包含了一堆标题,但gcc已经为第一个标题失败了:

#include <libnl3/netlink/netlink.h>
Run Code Online (Sandbox Code Playgroud)

没有"主标题",比如libnl.h.

>$ gcc netlink_test.c 
In file included from netlink_test.c:11:0:
/usr/include/libnl3/netlink/netlink.h:24:36: fatal error: netlink/netlink-compat.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

netlink.h文件包含"netlink/netlink-compat.h".不幸的是,没有"/ usr/include/netlink /"文件夹.只有"/ usr/include/libnl3/netlink /"

包括"netlink/netlink.h"因此给了我:

netlink_test.c:10:29: fatal error: netlink/netlink.h: No such file or directory
compilation terminated.
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu 12.04下安装了以下软件包:

libnl-3-200
libnl-3-200-dbg
libnl-3-dev
libnl-3-doc
libnl-genl-3-200
libnl-genl-3-200-dev
libnl-route-3-200
libnl-route-3-200-dev
Run Code Online (Sandbox Code Playgroud)

我在这里遗失了什么,或者这真的被打破了?

linux ubuntu ipc netlink

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

使用 spring 声明式缓存进行集成测试

我正在尝试为 Spring Boot 2 应用程序编写集成测试。

一项测试应测试通过 REST 更新值。

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureTestEntityManager
@Transactional
public class TenantEndpointIT {
    @Autowired
    private TestRestTemplate template;

    @Autowired
    private TestEntityManager entityManager;

    @Test
    public void nok_updateValueForbidden() {

    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我认为最TestEntityManager简洁的方法是在 @Before 方法中创建值,然后在实际测试中测试 REST 端点。

但是REST Endpoint 调用的服务使用 Spring Caching 注释进行了注释。所以如果我这样做,测试就会失败。我可以直接使用该服务或进行第二次 REST 调用。这会给使用相同值的其他测试带来问题,因为即使回滚数据库,缓存似乎也包含该值。(现在我正在使用@DirtiesContext)。

我的问题是,您如何正确地将测试服务与 @Cachable 集成?有没有办法获取缓存并显式放置/删除?我尝试自动装配 CacheManager,但它找不到并且失败了。

testing spring integration-testing caching spring-boot

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