【问题标题】:Resteasy does not find ExceptionMapper providerResteasy 没有找到 ExceptionMapper 提供者
【发布时间】:2012-09-13 17:28:50
【问题描述】:

我已经尝试了很多方法来完成这项工作,但无论如何它都不起作用。另外,我没有找到有关此的适当文档。 我正在尝试为我的CustomException 类型实现CustomExceptionMapperCustomException 被正确抛出,但未被捕获。

我认为用@Provider 注释CustomExceptionMapper 就足够了,但它没有被检测到。 我试图允许在 web.xml 中进行扫描,但我发现了这个:https://issues.jboss.org/browse/AS7-1739。我正在使用 7.0.1 最终版。可能解决方案是更改版本,但这个决定不取决于我。

我还发现您可以尝试覆盖 getClasses()getSingletons 方法并在那里添加您的 CustomExceptionMapper,但它只是没有检测到它。

我的应用程序类的样子:

import java.util.HashSet;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;


@ApplicationPath("/service")
public class MyApp extends Application {

    @Override
    public Set<Class<?>> getClasses() {
        Set<Class<?>> classes = new HashSet<Class<?>>();
        classes.add(TestExceptionMapper.class); 
        return classes;

    }
}

还有映射器

@Provider
public class TestExceptionMapper implements ExceptionMapper<TestException> {

    public Response toResponse(TestException ex) {
       //something, but I cannot reach it.
    }
}

Web.xml

 <context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>com.mycompany.rest.exceptions.TestExceptionMapper</param-value>        
</context-param>


<servlet>
    <servlet-name>RestletServlet</servlet-name>
    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
    <init-param>
        <param-name>org.restlet.application</param-name>
        <param-value>com.mycompany.rest.application.myApplication</param-value>
    </init-param>
</servlet>

以及通过 URL 调用的服务:

@Stateless
@Path("/somePath")
public class someService {

    @GET //this should be post, but for testing I'm using get
    @Path("/some/update/someth")
    @Produces()
    public String updateSometh(@NotNull @QueryParam("key") String key, @QueryParam(value = "somethID") Long somethID) throws TestException {
       // ....
    }

如果您使用正确的参数调用它,它会起作用。但是,如果您输入了错误的参数,则不会。
我也想说应用程序正在运行,但我只是想添加映射器。

【问题讨论】:

  • 你的代码在哪里抛出TestException
  • 我正在测试当我将 Long 参数设置为错误值(例如 120sd 而不是数字)时会发生什么。那里抛出异常,因为无法解析。
  • 请显示资源代码你在哪里做这个测试。我怀疑那里有问题,因为我的配置与您的配置非常相似,并且异常映射器工作正常。

标签: java rest jax-rs resteasy provider


【解决方案1】:

异常映射器适用于从资源方法体中抛出的异常。如果您修改资源以抛出TestException

public String updateSometh(@NotNull @QueryParam("key") String key, 
            @QueryParam(value = "somethID") Long somethID) throws TestException {
   throw new TestException();
}

映射器应该捕获异常。问题出在你的测试方式上。

【讨论】:

  • 嗯,很高兴知道。但是不管怎样,难道就不能捕捉到甚至没有到达body的异常吗?
  • 这些异常可能有您通常可以处理的不同原因。例如,在您的情况下,您可以使用 ValidatorAdaptor 来验证 somethID 参数。我认为您还需要将其设为 String 而不是 Long
  • 我会尝试使用验证器的方法,但是如果可以自动解析的话,必须自己解析似乎不是一个好方法
  • 其实ValidatorAdaptor适合更复杂的验证,也许在这种简单的情况下让Resteasy返回默认的Bad Request响应更好。
  • 如果RESTeasy配置为扫描所有资源,是否需要context-param
【解决方案2】:

您的 web.xml 是否具有 resteasy 提供者的上下文参数?

类似的东西

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>packagename.TestExceptionMapper</param-value>
</context-param>

【讨论】:

  • 如何在 RestEasy 中为不同类型的异常注册多个异常映射器?
【解决方案3】:

您还可以通过覆盖 classes() 方法在您的 javax.ws.rs.core.Application 类中注册自定义 ExceptionMapper,如下所示:

@ApplicationPath("/api")
public class RestApplication extends Application {

  @Override
  public Set<Class<?>> getClasses() {
    Set<Class<?>> classes = new HashSet<>();
    // other resource classes ...

    classes.add(CustomExceptionMapper.class);
    return classes;
  }
}

ExceptionMapper 本身可以使用 java.lang.Exception 作为 Type 参数来处理任何类型的异常。

@Provider
public class CustomExceptionMapper implements ExceptionMapper<Exception> {
    //...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 2020-05-06
    • 2017-08-13
    • 2011-03-09
    • 1970-01-01
    • 2021-05-06
    • 2019-12-03
    相关资源
    最近更新 更多