我需要一些启用了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) 我实现了一个自定义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 信号之前返回。
我有一些简短的单元测试,但失败了:
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) 我尝试为单元测试加载第二个属性文件,这会覆盖一些属性。
@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") …我正在尝试编写一个应该与包含相同类型的不同容器(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]
还有一些错误...
我正在尝试解析包含德语文本的 CSV 文件,即它不是用“逗号”分隔,而是用分号分隔,并且可能包含变音符号(\xc3\xa4\xc3\xb6\xc3\xbc 等)。
\n使用Cassava并按照链接的教程进行操作,对于标题包含变音符号的列,我收到错误:
\n\n\n解析错误(读取失败:转换错误:在“\\nEUR;0,99”处没有名为“W\\228hrung”的字段)
\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\nRun Code Online (Sandbox Code Playgroud)\n … 我想在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)
我在这里遗失了什么,或者这真的被打破了?
我正在尝试为 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,但它找不到并且失败了。