我正在创建一个验证字段的服务。如果该字段不符合我的规则,我会抛出一个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);
}
}
我发现了问题所在。我使用的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 资源中,一切都按预期工作。但是,如果调用我的提供程序类容器请求上下文始终为空。