我正在使用SpringSource Tool Suite开发Java Maven项目.我有标准的Maven目录结构
src
-> main
-> java
-> resources
-> test
-> java
-> resources
Run Code Online (Sandbox Code Playgroud)
该结构在.pom文件中定义:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>src/test/java</directory>
<includes>
<include>**</include>
</includes>
<excludes>
<exclude>**/*.java</exclude>
</excludes>
</testResource>
<testResource>
<directory>src/test/resources</directory>
</testResource>
</testResources>
</build>
Run Code Online (Sandbox Code Playgroud)
STS首先显示测试分支中的源文件夹,然后显示主分支中的源文件夹.所以我得到这样的东西:
src/test/java
src/test/resources
src/main/java
src/main/resources
Run Code Online (Sandbox Code Playgroud)
但是,我想首先从主分支中获取文件夹.关于如何改变这个的任何想法?
我有一个简单的Spring Bean Expression,当我在应用程序上下文文件中定义它时,它会很好地评估:
<bean id="myConfigBean" class="com.example.myBeanConfigBean">
<property name="myProperty" value="#{ someOtherBean.getData() }"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
现在,我想以编程方式进行相同的评估.我使用了以下代码:
final ExpressionParser parser = new SpelExpressionParser();
final TemplateParserContext templateContext = new TemplateParserContext();
Expression expression = parser.parseExpression("#{ someOtherBean.getData() }", templateContext);
final String value = (String) expression.getValue();
Run Code Online (Sandbox Code Playgroud)
这引发了一个异常:
EL1007E:(pos 22): Field or property 'someOtherBean' cannot be found on null
Run Code Online (Sandbox Code Playgroud)
我想我必须以某种方式设置一个根对象,允许配置的bean像属性一样.但我还没有让它工作.任何人,已经做过这个并且可以给出一个提示吗?
我正在尝试根据选择的结果创建一个新表。这适用于 SQL Server:
SELECT * INTO newTable FROM (SELECT col1, col2, col3 FROM oldTable) x;
Run Code Online (Sandbox Code Playgroud)
现在,我想用 HSQLDB(2.2 版)实现完全相同的功能。我尝试了几种形式,例如
SELECT * INTO newTable FROM (SELECT col1, col2, col3 FROM oldTable);
SELECT INTO newTable FROM SELECT col1, col2, col3 FROM oldTable;
CREATE TABLE newTable AS SELECT col1, col2, col3 FROM oldTable;
Run Code Online (Sandbox Code Playgroud)
所有这些变体都会导致某种形式的语法错误。如何使用 HSQLDB 从选择中创建表?
我想编写一个SpringBatch Tasklet,它自动激活或取消激活给定数据库表的所有索引.代码需要独立于DBMS(需要SQL Server,Oracle和HSQLDB).
这是我到目前为止所尝试的:
DatabaseMetaData dbMetaData = connection.getMetaData();
ResultSet rs = dbMetaData.getIndexInfo(null, null, tableName, true, false);
while (rs.next()) {
// work with ResultSet
}
Run Code Online (Sandbox Code Playgroud)
但是,我没有获得索引的名称或任何有用的信息.
那么,任何人都可以提供一些关于如何使用JDBC连接对象将表的所有索引设置为活动或非活动的提示吗?
我有一个带Wicket的Spring项目.我可以使用@SpringBean注释在Wicket组件中成功注入服务.
现在,我想访问Spring Application Context.所以我已经声明了一个ApplicationContext类型的成员变量,并使用@SpringBean注释它,就像其他服务一样:
尝试使用@SpringBean注入Application
public class MyPanel extends Panel {
@SpringBean
private ApplicationContext applicationContext;
...
}
Run Code Online (Sandbox Code Playgroud)
但是,在运行时,这会给出错误
bean of type [org.springframework.context.ApplicationContext] not found
Run Code Online (Sandbox Code Playgroud)
是否无法将ApplicationContext注入Wicket组件?如果是这样,那么访问ApplicationContext的合适方式是什么?
我有一个提供配置数据的 spring 服务。当 GUI 调用该服务时,它会从数据库加载配置数据。事实证明,这种情况在单个请求的渲染过程中经常发生。我想通过缓存配置数据来优化它。但是,我不确定这是否是一种好的编程风格,或者是否“允许”在服务中拥有实例变量。
这是我正在考虑做的一些示例代码:
@Serivce("MyConfigService")
public class MyConfigServiceImpl implements MyConfigService {
private Config cachedConfig;
@Override
public Config loadConfig() {
if (cachedConfig != null) {
// load config
cachedConfig = loadedConfig;
}
return cachedConfig;
}
@Override
public saveConfig(Config config) {
cachedConfig = null;
// save the configuration
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个简单的Spring-Service(除其他任务外)使用以下代码启动spring批处理作业:
@Autowired
private JobRegistry jobRegistry;
@Autowired
private JobLauncher jobLauncher;
public void startMyJob() {
Job job = jobRegistry.getJob("myJobName");
JobParameters jobParameters = new JobParametersBuilder().toJobParameters();
jobLauncher.run(job, jobParameters);
}
Run Code Online (Sandbox Code Playgroud)
只要调用Serivce-Method时没有活动的事务,此方法就可以正常工作。但是,对于一个活跃的交易,我得到了这个异常:
Caused by: java.lang.IllegalStateException: Existing transaction detected in JobRepository. Please fix this and try again (e.g. remove @Transactional annotations from client).
Run Code Online (Sandbox Code Playgroud)
我无法轻易删除现有事务,因为由于某些框架代码不在我的控制范围内而隐含了该事务。
那么,在这种情况下我该如何开始工作呢?新作业不应使用现有事务。它可以只是开始自己的事务-但是如何配置它以使其正常工作?
我有一个Guice托管服务,注入了一些其他服务.根据传递给我的服务方法的键值使用其他服务.所以我想制作一个Map将要使用的服务映射到相应的密钥:
@Inject
private IServiceA serviceA;
@Inject
private IServiceB serviceB;
private Map<String, IService> mapping;
private Map<String, IService> getMapping() {
if (mapping == null) {
mapping = new HashMap<String, IService>();
mapping.put("keyA", serviceA);
mapping.put("keyB", serviceB);
}
}
@Override
public void myServiceMethod(String key) {
IService serviceToUse = getMapping().get(key);
// ... use some methods of the identified service
}
Run Code Online (Sandbox Code Playgroud)
这个解决方案有效,但看起来很尴尬,因为我必须对映射进行这种懒惰的初始化.我试图使用一个static块,但此时Guice尚未初始化实例成员.
我更愿意直接用Guice注入映射值,但我不知道如何实现这一点.