Olá bom dia, estou com um probleminha aqui que no minimo é curioso, estou usando Hibernate e Spring com banco SqlServer, estou tentando capturar na camada de negocio a exception ConstraintViolationException, esta excessão está acontecendo no meu caso quando eu mando editar um item e coloco o nome de outro item que ja existe no banco, no meu caso o nome do item é uma chave. Então segue os arquivos:
Controlador de Categoria
public Categoria salvar(Categoria e) throws FiegException {
try {
return categoriaNegocioImp.salvar(e);
}catch(Exception ex){
if (ex.getCause() instanceof ConstraintViolationException) {
throw new FiegException("Ja existe uma categoria com esta descrição");
} else {
throw new FiegException(ex);
}
}
}
Negocio de categoria
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public Categoria salvar(Categoria e) throws FiegException {
Categoria ret = null;
try {
return objJpaImp.salvar(e);
} catch (Exception ex) {
if (ex.getCause() instanceof PersistenceException) {
throw new FiegException("Ja existe uma categoria com esta descrição");
} else {
throw new FiegException(ex);
}
}
}
Arquivo de excessões
@SuppressWarnings("all")
public class FiegException extends RuntimeException {
private static final long serialVersionUID = 1L;
public static final String INFO = "info";
public static final String ERROR = "error";
public FiegException() {
}
public FiegException(final Exception msg) {
super(msg);
}
public FiegException(final RuntimeException msg) {
super(msg);
}
public FiegException(final RollbackException msg) {
super(msg);
}
public FiegException(final PropertyAccessException msg) {
super(msg);
}
public FiegException(final PersistentObjectException msg) {
super(msg);
}
public FiegException(final String msg) {
super(msg);
}
public FiegException(final String msg, final Throwable cause) {
super(msg, cause);
}
public FiegException(final Throwable cause) {
super(cause);
}
public FiegException(final FileNotFoundException cause) {
super(cause);
}
public FiegException(final IOException cause) {
super(cause);
}
public FiegException(final NoResultException cause) {
super(cause);
}
public FiegException(final HibernateException cause) {
super(cause);
}
public FiegException(final NoSuchAlgorithmException cause) {
super(cause);
}
public FiegException(final UnsupportedEncodingException cause) {
super(cause);
}
public FiegException(final MalformedURLException cause) {
super(cause);
}
public FiegException(final SQLException cause) {
super(cause);
}
public FiegException(final SQLGrammarException cause) {
super(cause);
}
public FiegException(final JDBCException cause) {
super(cause);
}
public FiegException(final Class clazz, final String message) {
super(clazz.getName() + " : " + message);
}
public FiegException(final List<String> messages) {
super(geMensagens(messages));
}
public static String geMensagens(final List<String> messages) {
String msg = "";
for (final String message : messages){
msg += message + "\n";
}
return msg;
}
public String getNameException(){
return FiegException.class.getSimpleName();
}
public Map<String, Object> getValueObject() {
if (valueObject == null){
valueObject = new HashMap<String, Object>();
}
return valueObject;
}
public void setValueObject(final Map<String, Object> valueObject) {
this.valueObject = valueObject;
}
public void setErrorType(final String errorType){
getValueObject().put(getNameException(), errorType);
}
public static void newInfo(final String mensagem){
final FiegException be = new FiegException(mensagem);
be.setErrorType(FiegException.INFO);
throw be;
}
public FiegException(final DataIntegrityViolationException cause) {
super(cause);
}
public FiegException(final PersistenceException cause) {
super(cause);
}
public FiegException(final ConstraintViolationException cause) {
super(cause);
}
public static void newError(final String mensagem){
final FiegException be = new FiegException(mensagem);
be.setErrorType(FiegException.ERROR);
throw be;
}
O problema é que a excessão é lançada na camada de negocio mas só na camada de controle que consigo captura-la, ja tentei colocar o conteudo da excessão que está atualmente no controlador na camada de negocio e o sistema simplesmente ignora e retorna para a view a excessão sem trata-la, como se não existisse o try. Alguma sugestão ?