Java8のラムダ式内で発生した実行時例外のスタックトレースが表示されない場合があるのですが、発生条件がいまいちわかりません。
プロダクトコード
例外が発生するDaoクラス
発生するのはRuntimeExceptionのサブクラスであるIncorrectResultSizeDataAccessException。
idに対応するレコードが0件のとき発生します。
Java
1@Repository 2public class SomeDao implements SomeDaoSpec { 3 4 @Autowired 5 private NamedParameterJdbcTemplate template; 6 7 private static RowMapper<Something> rowMapper = (rs, i) -> { 8 Something result = new Something(); 9 //ResultSetからオブジェクトに値を詰める処理 10 return result; 11 }; 12 13 private static final String FIND_ONE_SQL = "SELECT * FROM something WHERE id=:id"; 14 15 @Override 16 public Something findOne(String id) { 17 return template.queryForObject(FIND_ONE_SQL, 18 new MapSqlParameterSource().addValue("id", id), rowMapper); 19 }
Serviceクラス
java
1 2@Service 3public class SomeService implements SomeServiceSpec { 4 5 @Autowired 6 private SomeSpec someDao; 7 8 @Override 9 public List<Some> getSomes(List<String> ids){ 10 //何かする 11 List<Some> result=Lists.newArrayList(); 12 ids.stream().forEach((id)->{ 13 result.add(someDao.findOne(id)); //ここで本来なら、daoクラスが例外を投げるのでスタックトレースが出るはず 14 }); 15 } 16} 17
Controllerの戻り値として500が返ってきているので、実行時例外が発生しているのはわかりますが、そのスタックトレースが表示されません。
検証用コード
Java
1public class Exec { 2 3 public static void main(String[] args) { 4 System.out.println("start..."); 5 getIns().ifPresent((obj) -> { 6 obj.throwErr(); 7 }); 8 System.out.println("end"); 9 10 } 11 12 private static Optional<Obj> getIns() { 13 return Optional.of(new Obj()); 14 } 15 16} 17 18class Obj { 19 20 public void throwErr() { 21 throw new RuntimeException("error!"); 22 } 23 24} 25
「もしかしてラムダ式の中で発生する実行時例外はすべてスタックトレースが表示されないのか?」
ということを検証するために上記の検証用コードを実行すると、これはスタックトレースがきちんと表示されます。
ラムダの中で発生する実行時例外のスタックトレースが表示されない状態の再現条件がわからないので、知っている方回答をよろしくお願いいたします。