Я пытаюсь выяснить, почему я получаю InvocationTargetException при сохранении модифицированного объекта игрока.
Этот проект представляет собой проект Spring Roo с Hibernate в качестве ORM (и GWT для внешнего интерфейса, но здесь это не имеет значения, поскольку ошибка происходит в бэкэнде).
При пошаговом выполнении кода возникает ошибка в player.persist (), который вызывается с помощью вызова RPC:
@Override
public LeagueDto setPlayerLeague(long playerId, String session, long leagueId) {
Player player = Player.findPlayer(playerId);
League league = League.findLeague(leagueId);
player.setLeague(league);
player.persist(); // fails here
// do some more stuff here before returning the DTO
return leagueDto;
}
Заход в player.persist () переходит к модели:
@RooJavaBean
@RooToString
@RooEntity(finders = { "findPlayersByUsername" })
public class Player {
@Temporal(TemporalType.TIMESTAMP)
@DateTimeFormat(style = "S-")
private Date created;
@NotNull
@Column(unique = true)
@Size(min = 3, max = 32)
private String Username;
....
@Size(max = 64)
private String FirstName;
@Size(max = 64)
private String LastName;
@ManyToOne
private Country country;
@ManyToOne
private League league;
...
}
Далее в модель переходим к коду AspectJ, где вызывается persist:
privileged aspect Player_Roo_Entity {
declare @type: Player: @Entity;
@PersistenceContext
transient EntityManager Player.entityManager;
....
@Transactional
public void Player.persist() {
if (this.entityManager == null) this.entityManager = entityManager();
this.entityManager.persist(this);
}
....
}
Затем ему удается перешагнуть this.entityManager.persist (this), и когда функция завершается, в RPC происходит сбой.
public static String invokeAndEncodeResponse(Object target,
Method serviceMethod, Object[] args,
SerializationPolicy serializationPolicy, int flags)
throws SerializationException {
....
String responsePayload;
try {
Object result = serviceMethod.invoke(target, args);
responsePayload = encodeResponseForSuccess(serviceMethod, result,
serializationPolicy, flags);
} catch (IllegalAccessException e) {
....
} catch (IllegalArgumentException e) {
....
} catch (InvocationTargetException e) {
// Try to encode the caught exception
//
Throwable cause = e.getCause();
responsePayload = encodeResponseForFailure(serviceMethod, cause, serializationPolicy, flags);
}
Есть идеи, почему это не удается? Я не делаю ничего сложного, просто базовое обновление.