3

私はこれを機能させるために多くのことを試みましたが、とにかく機能していません。また、これに関する適切なドキュメントが見つかりません。私はCustomExceptionMapper自分のCustomExceptionタイプにを実装しようとしています。はCustomException正しくスローされますが、キャッチされません。

CustomExceptionMapperで注釈を付ける@Providerだけで十分だと思いましたが、検出されません。web.xmlでスキャンを許可しようとしましたが、https ://issues.jboss.org/browse/AS7-1739で見つかりました。7.0.1Finalを使用しています。おそらく解決策はバージョンの変更ですが、この決定は私次第ではありません。

getClasses()また、 orgetSingletonsメソッドをオーバーライドして、そこにを追加することもできます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;

    }
}

そしてマッパー

@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

web.xmlにはresteasyプロバイダーのcontext-paramがありますか?

このようなもの

<context-param>
    <param-name>resteasy.providers</param-name>
    <param-value>packagename.TestExceptionMapper</param-value>
</context-param>
于 2012-09-21T09:50:38.453 に答える
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

次のように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 に答える