当前位置: 首页 > 知识库问答 >
问题:

spring rest中的

苍温文
2023-03-14
@ExceptionHandler(ConstraintViolationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public @ResponseBody
ExceptionResponseDTO hiberAnnotationExceptionHandler(ConstraintViolationException exception) {
    return  new ExceptionResponseDTO("Entity is null or we are out of range!", exception.getMessage(), ExceptionMapper.INSTANCE.exceptionToExceptionDTO(exception));
}
@Entity
public class Device {

    @Id
    @Column(name="name", nullable = false)
    private String Name;

    @Column(name = "send_date")
    @NotNull
    private Date sendDate;
}
Device d = new Device();
d.setName("sdsdsd");
d.setSendDate(null);
deviceRepository.save(d);

结果,我收到下一个异常:

[dispatcherServlet]:?-servlet.service()对于servlet[dispatcherServlet]在路径[]的上下文中抛出异常[请求处理失败;嵌套异常是org.springframework.transaction.transactionsystemException:无法提交JPA事务;嵌套异常是javax.persistence.rollbackException:提交事务时出错]具有根原因javax.Validation.ConstraintViolationException:在组[javax.Validation.groups.default]的更新期间对类[com.entity.device]的验证失败Validation.constraints.notnull.message}‘}]

因此,您可以从stacktrace中看到,我首先接收TransactionSystemException,因此,我的ExceptionHandler方法(hiberAnnotationExceptionHandler)不调用。所以我的问题是如何模拟这个异常(ConstraintViolationException)?提前谢了。

共有1个答案

史烈
2023-03-14

TransactionSystemException的原因

  1. hibernate实体管理器负责抛出所有hibernate异常

如果进入代码AbstractEntityManagerImpl.convert()方法,您将看到默认情况下它不处理任何特定的异常,如ConstraintViolution,而是在PersistenceException中抛出和包装。

  1. 首先注册一个JPA方言,它可以截获这些HibernateException,并在事务管理器bean中封装成特定的spring异常,就像这样。
 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
    <property name="jpaDialect" ref="jpaDialect"/>
</bean>

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>

HibernateJpaDealion捕获这些异常,并将其转换为spring特定的异常,如下所示

if (ex instanceof ConstraintViolationException) {
          ConstraintViolationException jdbcEx = (ConstraintViolationException) ex;
          return new DataIntegrityViolationException(ex.getMessage()  + "; SQL [" + jdbcEx.getSQL() +
                  "]; constraint [" + jdbcEx.getConstraintName() + "]", ex);
      }
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
      <property name="packagesToScan" value="com.pack.model" />
        <property name="persistenceUnitManager" ref="persistenceUnitManager"/>
        <property name="persistenceUnitName" value="entityManager"/>
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    </bean>    <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

@ExceptionHandler(dataIntegrityViolationException.class)

 类似资料:
  • 我有一个关于spring hateoas或spring Rest Data中加密资源/实体ID的标准模式或机制的问题。 我问的原因是,我们项目的一个要求是我们不将对象的id传递给外部世界,并且它们不应该在GET请求中用作参数。 我知道,Spring Rest数据和spring-hateoas不会给出对象的id,除非它们被配置成这样,但即使这样,我也可以在链接中看到id。 我知道我可以使用属性编辑器

  • 和ErrorHandler类: 问题是,如果我在RestExample.add方法中添加一个“Throw new RuntimeException”,那么RestErrorHandler类将正确处理该异常。 但是,当将一个无效的请求向控制器卷取时,RestErrorHandler不会捕获验证器抛出的异常,而我会收到一个400BadRequest响应。(对于无效请求,我指的是未指定用户名的xml请求

  • 我正在测试SpringREST服务,特别是POST方法 以下是我的控制器的代码片段: 员工类别: 我在pom.xml中也包含了jackson库的依赖 pom.xml 当我提交请求时,我的状态为:415不支持的媒体类型 这是我收到的错误消息:服务器拒绝了此请求,因为请求实体的格式不受请求方法的请求资源的支持。 请说明我做错了什么?

  • 我有一个rest服务,实现如下- 我得到了所有的头和响应状态正确,但我没有得到json响应。这里怎么了?

  • 我有一个带有请求映射和路径变量的Spring restController: 调用此控制器时,我收到Http 406 Not Acceptable错误,请求如下: 但不包括: 那不是很奇怪吗?直到最近我才发现也失败了,所以我猜这与扩展映射有关。 我如何处理此隐藏功能? 问候

  • 应用程序应异步(在单独的线程中)记录以下信息,而不会影响客户端。 请求HTTP方法和URI 如果我们在过滤器中使用,那么spring将无法再次使用它进行json到对象的映射。在输入流到对象映射期间的某个地方,我们可以插入记录器吗? 更新: 我们可以在MessageConverter中编写日志代码,但这似乎不是一个好主意。

  • 我正在尝试配置一个基于extjs作为前端和Spring作为后端的小应用程序。因此,为了从extjs与服务器通信,我们需要在存储区配置代理编写器。我的代理配置如下所示: 这是Spring控制器中的@Request estMmap: Tomcat每次回答“400错误请求”时都会使用描述“客户端发送的请求语法不正确”。 所以,但是如果我将代理类型更改为ajax并请求映射以获取POST请求,一切都可以正常

  • TLDR:目前通过数据库直接CRUD回购“保存”等方式管理数据(见下面的示例)。许多人说应该使用REST,但使用CRUD直接方法建立了超过3个数据库的45个表。是否值得花时间移植到REST方法??注意:该应用程序在公司内部使用,但有许多用户,仅供参考,如果安全是你的建议中的一个因素。 我不是术语学方面的佼佼者,因此在高级课程中,我将提供我目前使用的术语的示例。 我的工作是让承包商在3-4年前创建一