2

NotFoundException、MethodNotAllowedExceptionなどの組み込みの残りの簡単な例外をキャッチして処理するために、いくつかの例外マッパーを作成しました。サンプルコードは次のとおりです。

@Provider
public class NotFoundExceptionMapper implements ExceptionMapper<org.jboss.resteasy.spi.NotFoundException>
{
    @Override
    Response toResponse(org.jboss.resteasy.spi.NotFoundException exception) {
         return Response.status(500).build();
         }
}

また、Web フィルター クラスに try catch ブロックを記述しました。NotFoundException が発生するたびに、マッパーでキャッチされませんが、フィルターの catch ブロックに送られます。

JsonParsingExceptionを処理するために別の例外マッパークラスを試しました。これは正しく機能しており、Json 解析例外が発生するたびにマッパーから適切な応答が返されます。

この問題は、resteasy 例外の場合にのみ発生します。また、プロバイダーは、コンポーネント スキャン内の include-filter タグを使用して、アプリケーション コンテキストに登録されています。

マッパークラス自体で簡単に組み込みの例外をキャッチするために何をする必要があるかについて教えてください。

よろしく、RM

4

3 に答える 3

2

ここに私のデモプロジェクトがあります

1) 3 つの Java ファイルを含むシンプルな RESTful アプリ:

1.1) RestNotFoundExceptionHandler.java

package demo.app;

import javax.ws.rs.NotFoundException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class RestNotFoundExceptionHandler implements ExceptionMapper<NotFoundException> {
    @Override
    public Response toResponse(NotFoundException e) {
        return Response.ok().entity(e.toString() + "\n").type(MediaType.TEXT_PLAIN).build();
    }
}

1.2) AppRest.java

package demo.app;

import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;

@Path("/")
public class AppRest {
    @GET
    @Path("millis")
    @Produces(MediaType.TEXT_PLAIN)
    public String refresh(@Context HttpServletRequest request) {
        try {
            return Long.toString(System.currentTimeMillis()) + "\n";
        } catch (Exception e) {
            return e.toString() + "\n";
        }
    }
}

1.3) AppMain.java

package demo.app;

import javax.ws.rs.NotFoundException;
import org.jboss.resteasy.plugins.server.tjws.TJWSEmbeddedJaxrsServer;

public class AppMain {
    private static final int PORT = 8080;

    public static void main(String[] args) {
        AppRest appRest = new AppRest();
        TJWSEmbeddedJaxrsServer tjws = new TJWSEmbeddedJaxrsServer();
        tjws.setPort(PORT);
        tjws.setRootResourcePath("/rest");
        tjws.start();
        tjws.getDeployment().getRegistry().addSingletonResource(appRest);
        tjws.getDeployment().getProviderFactory().getExceptionMappers()
                .put(NotFoundException.class, new RestNotFoundExceptionHandler());
    }
}

2) プロジェクトの依存関係、4 つの jar ファイル

jaxrs-api-3.0.9.Final.jar
resteasy-jaxrs-3.0.9.Final.jar
servlet-api-2.5.jar
tjws-3.0.9.Final.jar

3) カール テスト ケース:

3.1) 通常の場合:

$ curl http://127.0.0.1:8080/rest/millis
1419167594504

3.2) RestNotFoundExceptionHandler ケース:

$ curl http://127.0.0.1:8080/rest/bad
javax.ws.rs.NotFoundException: Could not find resource for full path: http://127.0.0.1:8080/rest/bad
于 2014-12-21T13:32:30.783 に答える
2

私も同じ問題を抱えていました。@Component で NotFoundExceptionMapper にアノテーションを付けると、問題が修正されます (または、NotFoundExceptionMapper を Bean としてアプリケーション コンテキスト (xml ファイル) に追加します)。

Spring コンテキストが開始されたら、NotFoundExceptionMapper を登録する必要があります (ロギングで「Pre-instantiating singletons in ...」のようなものにする必要があります)。

于 2014-02-28T06:38:15.647 に答える
0

UnsupportedMediaTypeException をマップしようとしているときに、同じことを試してみましたが、問題が発生しました。

http://docs.jboss.org/resteasy/docs/1.1.GA/userguide/html/ExceptionHandling.htmlおよび Exception Mappers セクションの最初の行によると、アプリケーション例外のみをマップできるようです。

于 2012-04-25T19:46:50.773 に答える