Resteasy没有找到ExceptionMapper提供程序

时间:2012-09-21 09:41:34

标签: java rest jax-rs resteasy provider

我已经尝试了很多东西来完成这项工作,但无论如何它都无法正常工作。另外,我没有找到关于此的适当文档。 我正在尝试为CustomExceptionMapper类型实施CustomException。 <{1}}被正确抛出,但没有被捕获。

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

我还发现您可以尝试覆盖@ProvidergetClasses()方法并添加getSingletons,但它只是没有检测到它。

我的Application类如何:

CustomExceptionMapper

和Mapper

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;

    }
}

Web.xml中

@Provider
public class TestExceptionMapper implements ExceptionMapper<TestException> {

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

通过URL调用的服务:

 <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>

如果使用正确的参数调用它,则可以正常工作。但如果你输入一个不好的参数,它就不会 我也想说应用程序正在运行,但我只是想添加Mappers。

3 个答案:

答案 0 :(得分:2)

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

像这样的事情

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

答案 1 :(得分:2)

异常处理程序适用于从资源方法主体抛出的异常。如果您修改资源以抛出TestException

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

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

答案 2 :(得分:1)

您还可以通过覆盖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> {
    //...
}