小编mar*_*tin的帖子

使用Spring启动和设置内存数据库

我正在使用Spring编写一个Java的小型演示应用程序,它需要访问数据库.它应该在不同的机器上运行,设置一个真正的数据库将是太多的努力.因此我想使用嵌入式的.

DB具有给定的模式(两个表)和一些(非常少的)预定义的条目.我正在寻找一种简单的方法来启动内存数据库,创建表并填充数据.所有这些都应该在初始化Spring上下文时发生.

我的方法是使用H2作为我的数据库,然后使用Spring Batch从csv-或xml-files加载数据.但是我希望可能有更简单的方法来实现这一目标.是否有任何数据库/框架/工具可以开箱即用?

它只需要一些SQL命令来设置我需要的一切.我正在寻找一种在Spring环境中尽可能简单的方法.

database spring imdb h2

15
推荐指数
2
解决办法
4万
查看次数

Maven插件编译好但在执行期间找不到类

我遇到了以下Maven问题.

基本上,我有两个项目.项目A是Maven插件,项目B正在使用它.

项目A pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>io.github.martinschneider</groupId>
  <artifactId>demo-maven-plugin</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>maven-plugin</packaging>
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-simple</artifactId>
      <version>1.7.25</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>3.6.0</version>
    </dependency>
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>
Run Code Online (Sandbox Code Playgroud)

项目B pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>io.github.martinschneider</groupId>
  <artifactId>demo-project</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
    <plugins>
      <plugin>
        <groupId>io.github.martinschneider</groupId>
        <artifactId>demo-maven-plugin</artifactId>
        <version>0.0.1-SNAPSHOT</version>
      </plugin>
    </plugins>
  </build>
</project>
Run Code Online (Sandbox Code Playgroud)

mvn demo:demo在项目B上执行时,mojo开始执行但后来我收到以下错误:

[ERROR] Failed to execute goal my.group:my-maven-plugin:1.2.3:some-goal (default-cli) on project my-project: Execution default-cli …
Run Code Online (Sandbox Code Playgroud)

java slf4j maven-plugin maven

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

如果变量值为空,则从 logback 消息中删除空格

我使用以下 logback 模式:

<pattern>%X{version} %d{HH:mm:ss.SSS} %.-1level %C{0}:%M:%L %msg %n</pattern>
Run Code Online (Sandbox Code Playgroud)

如果设置了,这会产生一个很好的输出version,但在某些情况下它可以为空。

%X{version}在这种情况下,每个日志行中都有一个前导空格(由和之间的空格产生%d{HH:mm:ss.SSS})。

简单的解决方案是从模式中删除空格并将其附加到版本的值中。有没有更优雅的方法来解决这个问题?

logback

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

Tapestry应用程序中的会话超时AJAX错误

我正在使用Tapestry和Spring Security以及除Prototype之外的jQuery库构建一个webapp.当用户在会话超时后单击链接时,会自动将其重定向到登录页面.当然,这对于触发AJAX请求的链接不起作用.

我知道,这是任何类型的Web应用程序的常见问题(例如http://www.openjs.com/articles/ajax/session_timeout.php).Tapestry 5有最佳实践解决方案吗?

编辑 以下解决方案(感谢Henning)对我有用:

Ajax.Responders.register(
{
    onException: function()
    {
        window.location.reload();
    }
});

如果在AJAX调用期间发生故障,则会触发页面重新加载,从而重定向到登录页面.它仍然需要一些调整(例如显示错误消息而不是重定向),但使用Ajax.Responders基本上似乎是一种很好的方法.

ajax session jquery tapestry session-timeout

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

Spring集成测试不会回滚

我正在使用Spring + Hibernate + H2.我在集成测试中进行数据库操作(通过调用服务类).我希望Spring在每个测试方法之后回滚更改,但我无法让它工作.起初我使用MySQL(使用MyISAM,它不支持事务),但在更改为H2之后问题仍然存在.我尝试了几个DataSource定义(在阅读之后它必须是XA感知的),但似乎没有任何帮助.

我在我的服务层使用http://code.google.com/p/generic-dao/用于我的DAO类和@Transactional-annotations(如果我删除它们,我会收到以下错误:javax.persistence.TransactionRequiredException:没有交易正在进行中).

我的测试类看起来像这样:

@ContextConfiguration("classpath:...spring.xml")
@Transactional
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
public class DemoServiceTest extends AbstractTestNGSpringContextTests{
@Autowired
private DemoService demoService;

@Test
public void addTest()
{
    int size = demoService.findAll().size();
    Test coach = new Test();
    test.setName("Test");
    testService.save(test);
    Assert.assertEquals(size+1,testService.findAll().size());
}
}
Run Code Online (Sandbox Code Playgroud)

这是我的弹簧配置:

<!-- <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource"> -->
<!-- <property name="driverClassName" value="org.h2.Driver" /> -->
<!-- <property name="url" value="jdbc:h2:~/test" /> -->
<!-- <property name="username" value="sa" /> -->
<!-- <property name="password" value="" /> -->
<!-- </bean> -->
<!--    <bean id="myDataSource" class=" com.mchange.v2.c3p0.ComboPooledDataSource"> --> …
Run Code Online (Sandbox Code Playgroud)

spring integration-testing dao hibernate rollback

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

在 Eclipse 中自动在静态和非静态导入之间添加一个空行

我想根据Google Java Style格式化我的代码。

涉及到import 语句时存在一些问题。除了手动编辑每个类之外,我无法满足的一个规则是:

如果同时存在静态和非静态导入,则单个空行将两个块分开。

显然,没有办法Organize Imports在 Eclipse 中配置操作来添加这个空行。

是否有任何变通方法、插件或计划添加此类功能(或者是我自己编写一个或使用其他 IDE 的唯一选择)?

eclipse code-formatting checkstyle

6
推荐指数
2
解决办法
2721
查看次数

模拟void方法,改变他们的论点

我有一个界面,看起来像这样

public interface ParameterProvider
{
    void provideParameter(Map<String, String> parameters);
}
Run Code Online (Sandbox Code Playgroud)

它的一个实例用于我想要编写单元测试的方法:

@Override
public void process(...)
{
    ...
    Map<String, String> parameters = new HashMap<String, String>();
    parameterProvider.provideParameter(parameters);
    ...
}
Run Code Online (Sandbox Code Playgroud)

我如何模拟ParameterProvider对参数执行操作,传递给它的provideParameter-method?

我的第一个想法是将返回类型更改voidMap并实际返回修改后的内容Map(无论如何它似乎更好).然后测试没问题:

when(parameterProvider.provideParameter(anyMap())).thenReturn(MY_PARAMETERS);
Run Code Online (Sandbox Code Playgroud)

但是,由于接口在框架中使用,由于某些奇怪的原因似乎要求方法无效,因此现在不能选择.

有没有办法嘲笑这件事.我正在使用Mockito,但如果有其他模拟框架可以完成工作,我不需要坚持使用它.

编辑:我也尝试使用doAnwser,但我没有看到如何修改传递给该方法的参数:

doAnswer(new Answer() {
    public Object answer(InvocationOnMock invocation) {
        Object[] args = invocation.getArguments();
        args[0] // that's the argument I want to modify
        return null;
    }})
.when(parameterProvider).provideParameter(anyMap());
Run Code Online (Sandbox Code Playgroud)

java unit-testing mocking mockito

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

如何在 Java 中用 Unicode 字符填充字符串

我将右填充添加到 String 以表格格式输出它。

for (String[] tuple : testData) {
  System.out.format("%-32s -> %s\n", tuple[0], tuple[1]);
}
Run Code Online (Sandbox Code Playgroud)

结果如下(随机测试数据):

znZfmOEQ0Gb68taaNU6HY21lvo       -> Xq2aGqLedQnTSXg6wmBNDVb
frKweMCH8Kvgyk0J                 -> lHJ5r7YDV0jTL
NxtHP                            -> odvPJklwIzZZ
NX2scXjl5dxWmer                  -> wPDlKCKllVKk
x2HKsSHCqDQ                      -> RMuWLZ2vaP9sOF0yHmjVysJ
b0hryXKd6b80xAI                  -> 05MHjvTOxlxq1bvQ8RGe
Run Code Online (Sandbox Code Playgroud)

当存在多字节 unicode 字符时,此方法不起作用:

0OZotivbyGhZM1FIwNhn6r6cC -> OKDxDV1o2NMqXH3VvE7q3uONwEcY5V
fBHRCjU4K8OCdzACmQZSn6WO         -> gvGBtUO5a4gPMKj9BKqBHFKx1iO7
cDUhb0cXkLWkS                -> SZX
WtP9t                            -> Q0wWOeY3W66mM5rcQQYKpG
va4du8SS                       -> KI
a71??TZ??ws5J              -> b8A
Run Code Online (Sandbox Code Playgroud)

如您所见,对齐已关闭。

我的想法是计算字符串的长度和使用的字节数之间的差异,并使用它来抵消填充,如下所示:

int correction = tuple[0].getBytes().length - tuple[0].length();
Run Code Online (Sandbox Code Playgroud)

然后我不会填充到 32 个字符,而是填充到32 + correction. 然而,这也不起作用。

这是我的测试代码(使用emoji-java但行为应该可以用任何 unicode 字符重现):

import java.util.Collection;
import org.apache.commons.lang3.RandomStringUtils; …
Run Code Online (Sandbox Code Playgroud)

java unicode text-formatting

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

Tapestry:下拉组件的默认值

我将以下代码用于select-component:

Java的类:

@Component(parameters = {"blankOption=AUTO", "model=someModel", "value=someId",
                         "zone=someZone"})
private Select demoSelect;
Run Code Online (Sandbox Code Playgroud)

模板:

<select t:id="demoSelect" />
Run Code Online (Sandbox Code Playgroud)

这将呈现如下所示:

<select id="demoSelect" name="demoSelect">
    <option value=""></option>
    <option value="1">first</option>
    <option value="2">second</option>
    <option value="3">third</option>
</select>
Run Code Online (Sandbox Code Playgroud)

我正在寻找的行为是,预先选择某个选项(这应该在页面类中决定).如何在Tapestry中配置它?基本上我需要告诉Tapestry为适当的选项呈现"选中",例如:

<select id="demoSelect" name="demoSelect">
    <option value=""></option>
    <option value="1">first</option>
    <option value="2" selected="selected">second</option>
    <option value="3">third</option>
</select>
Run Code Online (Sandbox Code Playgroud)

是否足以改变模型(我不这么认为),或者我是否必须扩展Select-component本身.我发现这篇文章看起来非常有前途,但遗憾的是所有源代码的链接都已经死了.

select tapestry drop-down-menu

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

Hibernate Envers:查询修订的问题

我使用Hibernate Envers进行审计.我的实体看起来像这样:

@Entity
@Audited
public class Child
{
    @GeneratedValue
    @Id
    @Column
    private Long id;

    @Column
    private String test;

    // getters & setters
}
Run Code Online (Sandbox Code Playgroud)

现在我想查询这样的修订:

query = reader.createQuery().forRevisionsOfEntity(Child.class, false, true);
query.add(AuditEntity.property("test").eq("child1"));

Long id = ...;
query = reader.createQuery().forRevisionsOfEntity(Child.class, false, true);
query.add(AuditEntity.property("id").eq(id));
Run Code Online (Sandbox Code Playgroud)

第一个查询有效,执行第二个查询会抛出以下异常:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.Map
    at org.hibernate.property.MapAccessor$MapGetter.get(MapAccessor.java:118)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:77)
    at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:83)
    at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:381)
    at org.hibernate.type.ComponentType.nullSafeGetValues(ComponentType.java:354)
    at org.hibernate.type.ComponentType.nullSafeSet(ComponentType.java:309)
    at org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
    at org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:567)
    at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1612)
    at org.hibernate.loader.Loader.doQuery(Loader.java:717)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
    at org.hibernate.loader.Loader.doList(Loader.java:2294)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2172)
    at org.hibernate.loader.Loader.list(Loader.java:2167)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:448)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363) …
Run Code Online (Sandbox Code Playgroud)

hibernate hibernate-envers

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