3

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

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

我还发现您可以尝试覆盖getClasses()orgetSingletons方法并在那里添加您的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 {
       // ....
    }

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

4

3 回答 3

2

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

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

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

于 2012-09-21T10:27:19.060 回答
2

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

像这样的东西

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>packagename.TestExceptionMapper</param-value>
</context-param>
于 2012-09-21T09:50:38.453 回答
2

您还可以通过覆盖 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> {
    //...
}
于 2018-10-08T13:18:54.020 回答