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

Spring类AbstractMessageConverterMethodProcessor上的NullPointerException

夹谷山
2023-03-14

我正在创建一个验证字段的服务。如果该字段不符合我的规则,我会抛出一个ResourceBusinessException,这是我创建的一个类,用于处理不可处理的实体。但是,当抛出此异常时,Spring在类AbstractMessageConverterMethodProcessor上抛出NullPointerException。

首先,我的Spring版:

<spring-framework-version>4.2.6.RELEASE</spring-framework-version>
 /**
 * @param MyType
 * @return
 */
@ApiOperation(value = "", notes = "", authorizations = { @Authorization(value = ApplicationSwaggerConfig.securityOAuth2, scopes = { @AuthorizationScope(scope = WRITE_SCOPE, description = WRITE_DESCRIPTION) }) })
@ApiResponses(value = { @ApiResponse(code = 200, message = "OK"), @ApiResponse(code = 201, message = "Created"), @ApiResponse(code = 401, message = "Unauthorized"),
@ApiResponse(code = 403, message = "Forbidden"), @ApiResponse(code = 404, message = "Not Found"), @ApiResponse(code = 422, message = "Unprocessable Entity") })
@RequestMapping(value = "/xpto", method = POST, produces = { APPLICATION_XML_VALUE, APPLICATION_JSON_VALUE })
public ResponseEntity<Void> saveXPTO(@RequestBody MyType myType) {
    Long tenantId = 1L;
    MyClass myObject = service.findMyClass(tenantId, empresaType.getAttribute());
    MyOtherClass myOtherObject= this.applyForOne(myObject);
    PreconditionsRest.checkCondition(false, "ERROR!!"); // This is where I'm forcing an error.
    contribuinteService.saveMyOtherObject(myOtherObject);
    return new ResponseEntity<Void>(new HttpHeaders(), CREATED);
}
/**
 * Check condition.
 *
 * @param condition O(a)(s) condition
 */
public static void checkCondition(boolean condition, String message){
    if (!condition) {
        throw new ResourceBusinessException(message);
    }
}
public class ResourceBusinessException extends RuntimeException{

private static final long serialVersionUID = 1L;


private ErrorMessage errorMessage;


public ResourceBusinessException() {
    super();
}


public ResourceBusinessException(String message, Throwable cause,boolean enableSuppression, boolean writableStackTrace) {
    super(message, cause, enableSuppression, writableStackTrace);
}


public ResourceBusinessException(String message, Throwable cause) {
    super(message, cause);
}


public ResourceBusinessException(String message) {
    super(message);
}


public ResourceBusinessException(Throwable cause) {
    super(cause);
}


public ResourceBusinessException(ErrorMessage errorMessage){
    super(errorMessage.getDetail());
    this.errorMessage = errorMessage;
}


public ErrorMessage getErrorMessage() {
    return errorMessage;
}

}

我的ResourceBusinessExceptionHandler

public class ResourceBusinessExceptionHandler extends ErrorMessageRestExceptionHandler<ResourceBusinessException>{


private static final Logger LOGGER = LoggerFactory.getLogger(ResourceBusinessExceptionHandler.class);

private ErrorMessage errorMessage;

public ResourceBusinessExceptionHandler() {
    super(UNPROCESSABLE_ENTITY);
}


@Override
public ErrorMessage createBody(ResourceBusinessException ex, HttpServletRequest req) {
    LOGGER.debug("ResourceBusinessExceptionHandler - Started");
    ErrorMessage tmpl = super.createBody(ex, req);
    ValidationErrorMessage msg = new ValidationErrorMessage(tmpl);
    errorMessage=ex.getErrorMessage();
    if(errorMessage==null){
        errorMessage = new ErrorMessage();
    }
    msg.setType(ResourceHandlerUtil.getType(errorMessage,UNPROCESSABLE_ENTITY_SPEC));
    msg.setTitle(ResourceHandlerUtil.getTitle(errorMessage,HttpStatus.UNPROCESSABLE_ENTITY));
    msg.setDetail(ResourceHandlerUtil.getDetail(errorMessage,HttpStatus.UNPROCESSABLE_ENTITY));
    msg.setInstance(ResourceHandlerUtil.getUriInstance(errorMessage,UNPROCESSABLE_ENTITY_URI));
    LOGGER.debug("ResourceBusinessExceptionHandler - Complete");
    return msg;
}

我的配置bean:

<bean id="compositeExceptionResolver" class="org.springframework.web.servlet.handler.HandlerExceptionResolverComposite">
    <property name="order" value="0" />
    <property name="exceptionResolvers">
        <list>
            <ref bean="exceptionHandlerExceptionResolver" />
            <ref bean="restExceptionResolver" />
        </list>
    </property>
</bean>

    <bean id="restExceptionResolver" class="cz.jirutka.spring.exhandler.RestHandlerExceptionResolverFactoryBean">
    <property name="messageSource" ref="httpErrorMessageSource" />
    <property name="defaultContentType" value="application/json" />
    <property name="exceptionHandlers">
        <map>
            <!-- 422 -->
            <entry key="com.company.project.exception.ResourceBusinessException">
                <bean class="com.company.project.exception.handler.ResourceBusinessExceptionHandler"/>
            </entry>
        </map>
    </property>
</bean><bean id="exceptionHandlerExceptionResolver" class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver"/>

<bean id="httpErrorMessageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource" p:defaultEncoding="UTF-8"/>
  protected void processResponse(ResponseEntity<?> entity, NativeWebRequest webRequest) throws Exception {

    ModelAndViewContainer mavContainer = new ModelAndViewContainer();
    try {
        responseProcessor.handleReturnValue(entity, null, mavContainer, webRequest);

    } catch (HttpMediaTypeNotAcceptableException ex) {
        LOG.debug("Requested media type is not supported, falling back to default one");
        fallbackResponseProcessor.handleReturnValue(entity, null, mavContainer, webRequest);
    }
}

共有1个答案

澹台镜
2023-03-14

我发现了问题所在。我使用的Spring版本与Spring-rest-exception-handler-version不兼容。我使用的rest异常处理程序来自这个github项目:https://github.com/jirutka/spring-rest-exception-handler。

因此,如果您使用的是Spring4.2.6发行版,那么应该将spring-rest-exception-handler的版本更新到1.2.0。这应该可以解决NullPointerException。

 类似资料:
  • 问题内容: 我对Spring不太熟悉,并且遇到以下情况: 存储库类: 使用存储库类的类: 我知道,如果我用注释并与一起使用,则 可以解决。问题是我处于一种需要创建带有反射的新实例的情况下。因此永远不会解决,并且始终为null。 在这种情况下有没有办法使用? 更好地解释我的情况:我有一些实现。在我的应用程序的设置阶段,我将创建以下实现。基本上: 然后,我有了一个泛型,可以 使用 ,上面的内容和反射内

  • 我在测试spring Junit测试配置时得到一个NullPointerException。问题在于使用@ContextConfiguration和@AutoWired注释。 当我实例化上下文并直接获得对bean的引用(如测试方法中注释掉的代码所示)时,测试正确运行并成功。但是当我尝试使用@ContextConfiguration和@AutoWired注释时,使用相同的XML文件属性,我在asse

  • 问题内容: 我正在尝试在JBoss7.1.1服务器中部署我的项目。但是我得到的信息不足,我的项目没有得到部署。 我正在使用Spring 3.1.1 Release jars。提前致谢。 问题答案: 在典型的servlet应用程序中,您将有一个描述符文件来声明应用程序的服务,过滤器,侦听器,上下文参数,安全性配置等。从Servlet 3.0开始,您可以通过编程方式完成大多数操作。 Servlet 3

  • 问题内容: 当我从eclipse部署时,我有一个spring项目在我的tomcat7服务器上运行良好:运行方式>>在服务器上运行。在eclipse标签的“服务器”中,我看到: 我的项目: 不使用web.xml,我使用javaconf @批注。 不使用Maven,我使用用户库 我看到该项目在: 而且,我还看到以下文件夹:conf,logs,temp,webapps,work,wtpwebapps 我

  • 我正在尝试编写一个关于悲观写入的JUnit测试。我的想法是在一个事务中执行这个方法,同时在另一个事务中再次运行它,并尝试修改从第一个事务中的方法返回的元素。我预计会出现异常/超时,因为第一次调用应该锁定该行。我已经做了类似的事情,但是第二个事务(testNewTrans方法)毫不犹豫地修改了元素。有什么地方我做错了吗? in jUnit 在新班级

  • 我已经看了很多帖子,似乎没有什么能像我喜欢的那样工作。 我想将一个对象从一个过滤器注入到ContainerRequestContext属性中,然后在其他类中检索它。 这是我的过滤器: 下面是我想要访问ContainerRequestContext的类: 我的spring配置: 如果我将容器请求上下文注入到我的 Web 资源中,一切都按预期工作。但是,如果调用我的提供程序类容器请求上下文始终为空。