我有所有国家的休息网址 - http://api.geonames.org/countryInfoJSON?username=volodiaL.
我使用Spring 3中的RestTemplate将返回的json解析为java对象:
RestTemplate restTemplate = new RestTemplate();
Country[] countries = restTemplate.getForObject("http://api.geonames.org/countryInfoJSON?username=volodiaL",Country[].class);
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,我得到一个例外:
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of hello.Country[] out of START_OBJECT token
at [Source: sun.net.www.protocol.http.HttpURLConnection$HttpInputStream@1846149; line: 1, column: 1]
at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:691)
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:685)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.handleNonArray(ObjectArrayDeserializer.java:222)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:133)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:18)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2993)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readJavaType(MappingJackson2HttpMessageConverter.java:225)
... 7 more
Run Code Online (Sandbox Code Playgroud)
最后我的国家班:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public class Country {
private String countryName;
private long geonameId;
public String getCountryName() {
return countryName;
} …
Run Code Online (Sandbox Code Playgroud) 我使用JDBC并从sql脚本创建了名为usaDB的h2数据库.然后我用jdbc填充所有表.
问题是我在localhost:8082连接到usaDB后,我在左边的树上看不到我的表.只有INFORMATION_SCHEMA数据库rootUser
,我指定创建usaDB.
如何在h2数据库中查看表的内容?
我试过查询SELECT * FROM INFORMATION_SCHEMA.TABLES
.
但它返回了许多表名,除了我创建的那些.我的快照:
当我输入eclipse时,不会自动显示内容辅助,但只有在我按下Ctrl+之后Space.我曾经输入类名,eclipse会自动提出好的建议.
但现在它没有用.
使用junit4测试spring服务层的下一个问题是:如何在所有@Test方法之前调用仅填充一次数据库的脚本:我想在所有@Tests之前执行一次:
JdbcTestUtils.executeSqlScript(jdbcTemplate(), new FileSystemResource(
"src/main/resources/sql/mysql/javahelp-insert.sql"), false);
Run Code Online (Sandbox Code Playgroud)
我试图在我的GenericServiceTest类上使用@PostConstruct(由测试类扩展).事实证明,每次@Test方法之前都会调用@PostConstruct.有趣的是,甚至在每个@Test方法之前调用注释了@Autowired of GenericServiceTest的方法.
我不希望在每个测试类之前填充数据库,但只在spring-test启动时填充一次.
如何在使用spring测试框架和junit4的所有@Test方法之前只执行一次上面的方法?
谢谢!
我想使用spring测试框架测试hibernate session的save()方法.@Test方法是:
@Test
@Transactional
public void testSave() {
User expected = createUser();
getGenericDao().currentSession().save(expected);
User actual = getUser(generatedId);
assertUsersEqual(expected,actual);
}
Run Code Online (Sandbox Code Playgroud)
我想将用户刷新到数据库中.我想让我的用户在这个方法之后进入数据库
getGenericDao().currentSession().save(expected);
Run Code Online (Sandbox Code Playgroud)
然后我想使用spring数据框架转到数据库,并通过下一行获取此保存的用户:
User actual = getUser(generatedId);
Run Code Online (Sandbox Code Playgroud)
我尝试使用hibernate flush方法,如:
currentSession().setFlushMode(MANUAL);
//do saving here
currentSession().flush();
Run Code Online (Sandbox Code Playgroud)
它不会将我的用户刷新到数据库中!但是,如果我没有使用@Transactional spring注释并将我的用户保存在编程弹簧事务中,那么我实现了我想要的.不幸的是,由于没有spring @Transactional,因此保存到db的用户不会回滚.因此,我的测试方法会更改后续测试方法的db和行为.
所以我需要将我的用户刷新到db里面的测试方法(不是在最后),并在测试方法结束时回滚所有对db的更改.
UPDATE建议准备方法如下:
@Transactional
public void doSave(User user){
getGenericDao().currentSession().save(user);
}
Run Code Online (Sandbox Code Playgroud)
并且在testSave中调用doSave什么都不做.执行此方法后,我仍然没有db中的用户.我设置断点并从命令行检查我的数据库.
更新非常感谢您的回复.问题是方法flush()不会将我的用户放入数据库.我尝试了Isolation.READ_UNCOMMITTED并且它没有将我的用户放入数据库.我可以实现我想要的,但前提是我在@Test方法上关闭spring事务并在程序化事务中保存.然后@Test方法不回滚,为后续的@Test方法留下保存的用户.这里保存用户的@Test方法不像删除用户的@Test方法那样危险,因为它没有回滚.因此必须对@Test方法提供Spring事务支持,我无法将我的用户(或删除)放入db.实际上,只有在@Test方法结束并且@Test方法的事务被调用后,才会将用户放入(或删除)到db中.所以我想在@Test方法的中间将我的用户保存到db中,并在@Test方法结束时回滚它
谢谢!
java hibernate spring-test hibernate-session spring-transactions
我的mysql db的jdbc驱动程序是版本5.1.25.
我想像这样执行sql查询:
statement.execute("select fullName from user where user_id=1; select fullName from user where user_id=2");
Run Code Online (Sandbox Code Playgroud)
我总是收到异常:
Exception in thread "main" com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'select fullName from user where user_id=2' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1054)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2809) …
Run Code Online (Sandbox Code Playgroud) 我有root实体Hostel
及其单一关联User owner
.
当我获取Hostel
实体时,我需要急切地获取User owner
,但只有owner
3个属性:userId,firstName,lastName.
现在我的标准查询是:
Criteria criteria = currenSession().createCriteria(Hostel.class);
criteria.add(Restrictions.ge("endDate", Calendar.getInstance()));
if (StringUtils.notNullAndEmpty(country)) {
criteria.add(Restrictions.eq("country", country));
}
Long count = (Long) criteria
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
.setProjection(Projections.rowCount()).uniqueResult();
criteria.setFetchMode("owner", FetchMode.SELECT);
criteria.addOrder(Order.desc("rating"));
// needed to reset previous rowCount projection
criteria.setProjection(null);
// retrieve owner association
criteria.createAlias("owner", "owner", JoinType.LEFT_OUTER_JOIN)
.setProjection(
Projections.projectionList()
.add(Projections.property("owner.userId"))
.add(Projections.property("owner.firstName"))
.add(Projections.property("owner.lastName")));
criteria.setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP);
Run Code Online (Sandbox Code Playgroud)
接下来,我这样做criteria.list()
,我得到sql语句,它只选择owner
投影列表中指定的3个属性.但它不会选择root Hostel
实体的任何属性.生成的查询是:
select
owner1_.user_id as y0_,
owner1_.firstName as y1_,
owner1_.lastName as y2_
from
HOSTEL this_
left outer …
Run Code Online (Sandbox Code Playgroud) 我有一个GenericService
类封装了子类的crud方法:
public abstract class GenericService<D extends GenericDao<T, I>, T extends DomainObject<I>, I> {
public I save(T t) {
return getDao().save(t);
}
...........................
}
Run Code Online (Sandbox Code Playgroud)
课程AnswerService
延伸GenericService
.它autowires AnswerDao
并声明自己已@Service
与@Transactional
春天的组成部分.
@Service
@Transactional(propagation = Propagation.REQUIRED)
public class AnswerService extends GenericService<AnswerDao, Answer, Long> {
@Autowired
private AnswerDao answerDao;
@Override
public void setDao(AnswerDao d) {
this.answerDao = d;
}
@Override
public AnswerDao getDao() {
return answerDao;
}
................................
}
Run Code Online (Sandbox Code Playgroud)
AnswerDao
extends GenericDao
实现方法save
.
public abstract …
Run Code Online (Sandbox Code Playgroud) 我决定学习JavaFX.我需要浏览类的源代码javafx.scene.layout.StackPane
.所以我按F3去了源代码.没有源代码,也没有允许附加源代码的按钮.我在网上看了一下,但没有找到任何有用的东西.我使用eclipse kepler和java7.我的classpath中有jfxrt.jar.
我使用JFileChooser的方法showOpenDialog打开文件.
如何将ActionListener附加到"批准"按钮JFileChooser
以及如何在单击"批准"按钮并完成侦听器后停止关闭此对话框.
现在我有:
public class MainFileChooser extends JFileChooser {
private FileFilter plainFilter;
public MainFileChooser() {
super.setMultiSelectionEnabled(true);
super.setAcceptAllFileFilterUsed(false);
plainFilter = new PlainFilter();
}
public int showOpenFileDialog() {
ActionListener actionListener = null;
// JDialog openFileDialog = super.createDialog(getParent());
super.addActionListener(actionListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
File[] selectedFiles = MainFileChooser.this.getSelectedFiles();
for (File file : selectedFiles) {
if (!file.exists()) {
JOptionPane.showMessageDialog(getParent(), file.getName() + " does not exist!",
"File is not found", JOptionPane.ERROR_MESSAGE);
}
}
}
});
super.setFileFilter(plainFilter);
int userOption …
Run Code Online (Sandbox Code Playgroud) java ×9
hibernate ×3
spring ×3
eclipse ×2
mysql ×2
spring-test ×2
autocomplete ×1
fasterxml ×1
h2 ×1
javafx ×1
jdbc ×1
jfilechooser ×1
resttemplate ×1
swing ×1