5

この例外マッパーを呼び出して 404 not found 応答を返そうとしていますが、500 内部エラーが返され続けます。ジャージーのバージョンは 2.22.1 です。以下のコード スニペット。すべての助けに感謝します。

ありがとう。

例外マッパー クラス。

package org.learn.rest.messengerdemo.exception;

import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class DataNotFoundExceptionMapper implements  ExceptionMapper<DataNotFoundException>{

    @Override
    public Response toResponse(DataNotFoundException ex) {
        return Response.status(Response.Status.FORBIDDEN).build();
    }
}

例外クラス。

パッケージ org.learn.rest.messengerdemo.exception;

public class DataNotFoundException extends RuntimeException{

    private static final long serialVersionUID = 2176642539344388961L;

    public DataNotFoundException(String message)
    {
        super(message);
    }
}

スローするサービスクラスのメソッド。

public Message getMessage(long messageId) {
    Message message =  messages.get(messageId);
    if(message == null)
    {
        throw new DataNotFoundException("Message with id " + messageId + " not found");
    }
    return message;
}

そしてリソースクラス。

@GET
@Path("/{messageId}")
public Message getMessage(@PathParam("messageId") long messageId) {
    return messageService.getMessage(messageId);
}
4

3 に答える 3

19

前の質問web.xmlから見ると、これがあります

<servlet>
    <servlet-name>Jersey Web Application</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>org.learn.rest.messengerdemo.resources</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

この init-parmjersey.config.server.provider.packagesは、Jersey が名前付きパッケージをスキャンして、@Pathアノテーション付きのリソース クラスと@Providerアノテーション付きのプロバイダー クラスを探し、それらを登録する必要があることを示しています。

リソース パッケージのみがorg.learn.rest.messengerdemo.resourcesリストされていますExceptionMapperが、別のパッケージに入っています。デフォルトの動作は再帰的にスキャンすることです。つまり、サブパッケージもスキャンします。したがって、代わりにリストすると、リソース パッケージ例外パッケージのorg.learn.rest.messengerdemo両方にヒットします。または、コンマまたはセミコロンで区切って両方のパッケージをリストすることもできます。どちらの方法でも機能します

<param-value>org.learn.rest.messengerdemo</param-value>
<!-- OR -->
<param-value>
    org.learn.rest.messengerdemo.resources,
    org.learn.rest.messengerdemo.exception
</param-value>
于 2015-10-28T19:13:01.860 に答える