如何使用 JAX-RS 异常上的自定义消息设置 40X 错误?

Posted

技术标签:

【中文标题】如何使用 JAX-RS 异常上的自定义消息设置 40X 错误?【英文标题】:How do I set a 40X error with a custom message on JAX-RS Exception? 【发布时间】:2011-12-21 08:29:57 【问题描述】:

我正在开发一个已经在工作的 JAX-RS 上的 Web 服务。现在我正在寻找捕获一些异常的方法,以便向用户发送带有自定义消息的 40X 错误。

我有一个 Web 服务和一个 ExceptionMapper。

这是我的网络服务:

@Path( value = "/test/")
public interface ServiceTest 

    @Path(value = "rrf")
    @GET
    @Produces(MediaType.TEXT_XML)
    public ObjectDTO getDealer(@PathParam("rrf") String rrf)
        ObjectDTO objectDTO = new ObjectDTO();
        if( verifyRRFSintax(rrf) ) 
            //Get the objet, this part works fine
         else 
            throw new IllegalArgumentException("Custom message");
         
        return dwsDTO;
    

    private boolean verifyRRFSintax(String rrf) 
        return rrf.matches("[0-9]8");
    

这是我的异常映射器

@Provider
@Produces(MediaType.TEXT_XML)
public class IllegalArgumentExceptionMapper 
    implements ExceptionMapper<IllegalArgumentException> 

    @Override
    public Response toResponse(IllegalArgumentException e) 
        return Response.status(Response.Status.BAD_REQUEST).build();
    

这就是它在 application-context.xml 文件中的注册方式

<bean id="serviceTest" class="ServiceTest"/>

<jaxrs:server id="Server" address="/ws">
    <jaxrs:serviceBeans>
        <ref bean="serviceTest"/>
    </jaxrs:serviceBeans>
    <jaxrs:providers>
        <bean id="rffErrorException" class="IllegalArgumentExceptionMapper"/>
    </jaxrs:providers>
</jaxrs:server>

当我调试时,IllegalArgumentExceptionMapper 捕获了我抛出的异常,但我没有在浏览器上显示的黄色网页上看到该消息。我总是有一个

错误分析 XML : aucun élément trouvé / XML Parsing Error: no 找到的元素(英文)

如何在浏览器上显示此自定义消息? 为什么,即使我更改了响应状态的种类(NOT_FOUND、BAD_REQUEST、FOBIDDEN),这个黄页总是一样的?

PD:在控制台上,当 Mapper 捕获异常时,我会打印一条消息“out.handlemessage”。

谢谢。

【问题讨论】:

好的,谢谢,我终于找到了我需要的东西:我添加了一个自定义异常,例如: public class DwsWebServiceException extends WebApplicationException public DwsWebServiceException(String message, int status) super(Response.status(status ).entity(message).type(MediaType.TEXT_XML).build()); 并且它正在显示消息。 【参考方案1】:
throw new WebApplicationException(Response.status(Status.NOT_FOUND)// Or another Status
                .entity("Error Message").build());

【讨论】:

我不知道其他 JAX-RS 实现,但对我来说,使用 RestEasy 3.0x,这将不起作用。它静默失败,客户端没有收到任何响应。您需要将.type( MediaType.TEXT_PLAIN ) 添加到Response 构建器中的方法链中,否则它似乎会阻塞字符串“实体”。 谢谢,@Lambart,感谢您的评论,我找到了这个:***.com/questions/23628897/… @FerranMaylinch 很高兴为您提供帮助。我看到我自己之前已经对这个问题和答案投了赞成票。 :)

以上是关于如何使用 JAX-RS 异常上的自定义消息设置 40X 错误?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:来自 UserDetailsS​​ervice 的自定义异常消息

带有错误代码和错误消息的自定义 Python 异常

delphi如何接收别的程序发过来的自定义的消息

谷歌地图上的自定义缩放级别

未抛出 spring webflux 的自定义异常

MFC自定义消息的方法?