簡體   English   中英

Resteasy沒有找到ExceptionMapper提供程序

[英]Resteasy does not find ExceptionMapper provider

我已經嘗試了很多東西來完成這項工作,但它無論如何都沒有用。 另外,我沒有找到關於此的適當文檔。 我試圖為我的CustomException類型實現一個CustomExceptionMapper 正確拋出CustomException ,但它沒有被CustomException

我認為,詮釋着CustomExceptionMapper@Provider已經足夠了,但狀態並沒有檢測到。 我試圖允許在web.xml中掃描,但我發現了這個: https//issues.jboss.org/browse/AS7-1739 我正在使用7.0.1 Final。 可能解決方案是改變版本,但這個決定不適合我。

我還發現你可以嘗試覆蓋getClasses()getSingletons方法並在那里添加你的CustomExceptionMapper ,但它只是沒有檢測到它。

我的Application類如何:

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;

    }
}

和Mapper

@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 {
       // ....
    }

如果用正確的參數調用它,它就可以工作。 但是如果你輸入一個錯誤的參數,它就不會。
我也想說應用程序正在運行,但我只是想添加Mappers。

您的web.xml是否具有resteasy提供程序的context-param?

這樣的事情

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

異常處理程序適用於從資源方法主體拋出的異常。 如果您修改資源以拋出TestException

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

映射器應該捕獲異常。 問題出在你測試的方式上。

您還可以通過重寫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> {
    //...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM