java - JAX-RS : Suppress Error Message

标签 java rest enums jax-rs resteasy

我有一个类采用枚举值,例如 Male,Female @POST。当我发送了一个错误的值,如“男性”而不是“男性”时,它向我显示 400 Bad Request,并在其余客户端中显示此消息:无法从字符串值“男性”构造常量实例。Constants$GenderEnum : value 不是声明的 Enum 实例名称之一 在 [来源:org.apache.catalina.connector.CoyoteInputStream@718a453d;行:7,列:23](通过引用链:valueobjects.ConsumerValueObject["gender"])

我的休息终点如下所示:

@Consumes("application/json")
@Produces("application/json")
@POST
public Response addConsumer(ConsumerValueObject consumerVO)

这里 ConsumerValueObject 保存枚举。

如何在 Rest 客户端中抑制该错误消息?我尝试使用 ExceptionMapper,但它没有帮助!由于安全问题,我需要禁止显示消息!

最佳答案

这是 jackson 对 JsonParseExceptionMapper 的回应或 JsonMappingExceptionMapper .这些类自带依赖

<dependency>
  <groupId>com.fasterxml.jackson.jaxrs</groupId>
  <artifactId>jackson-jaxrs-json-provider</artifactId>
  <version>${2.x.version}</version>
</dependency>

无论您是否有这种明确的依赖关系,或者您有 resteasy-jackson2-provider(它在幕后使用上面的内容),很可能映射器是通过类路径扫描隐式注册的。例如,您有一个空的 Application 类。

@ApplicationPath("/")
public class ResteasyApplication extends Application {}

这将通过类路径扫描导致发现/注册。如果您没有这些依赖项中的任何一个,并且如果您在 Wildfly 中,我不确定它们是如何注册的,但这就是正在发生的事情。

您可以为 JsonParseExceptionJsonMappingException 编写/注册您自己的 ExceptionMappers

@Provider
public class JsonMappingExceptionMapper 
             implements ExceptionMapper<JsonMappingException> {
    
    @Override
    public Response toResponse(JsonMappingException e) {
        return Response.status(Response.Status.BAD_REQUEST).build();
    } 
}

但根据我的测试,要注册哪一个,是你的还是 Jackson 的,这是一个折腾。映射器被放入一个集合(如此无序),然后被插入一个 map ,所以只有一个被插入。他们被插入的顺序就像我说的那样是一个折腾。

我想这实际上只是部分答案,因为除了显式注册所有类(最终 disabling the classpath scanning )之外,我无法找到保证使用映射器的解决方案,但这很麻烦.

但现在战斗已经缩小了。如果以后有机会我会再试一次


更新

所以这不是一个解决方案,只是一个半概念验证,以展示我们如何让它使用我们的 ExceptionMapper。

import org.jboss.resteasy.spi.ResteasyProviderFactory;
import com.fasterxml.jackson.databind.JsonMappingException;

import com.my.pkg.JsonMappingExceptionMapper;

@Path("/init")
public class InitResource {
    
    @GET
    public Response init() {
        ResteasyProviderFactory factory = ResteasyProviderFactory.getInstance();
        factory.getExceptionMappers().put(JsonMappingException.class, 
                                          new JsonMappingExceptionMapper());
        return Response.ok("Done!").build();
    }
}

一旦我们第一次访问 init 端点,我们的 JsonMappingExcpetionMapper 将注册并覆盖现有的,无论是 Jackson 的还是我们的。

当然我们不想真的这样做,它只是展示如何覆盖映射器。我不知道该把这段代码放在哪里。我在 Application 构造函数中尝试了一个 ServletContextListener,在一个低优先级的 Feature 中。我想不通。在 RESTeasy 最终注册之前,以上都不会发生。

关于java - JAX-RS : Suppress Error Message,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31452149/

相关文章:

java - 如何使用 Gson、Retrofit、Active Android 将嵌套 JSON 对象反序列化为字符串

spring - AngularJS $Http CORS 与 Spring Rest & Security 中的后端

java - 根据 Dart 中的天数获取日期

rest - 在 codeception 中将文件发送到 Restful 服务

java - 在 rest Controller 中的单个端点上组合文件上传和请求正文

c# - 在枚举中指定底层类型的用例是什么?

ruby-on-rails - 在 Simple_Form 中使用 Rails Active Record 枚举类型

c# - 如何防止枚举值的按位或组合?

java - Swing DefaultTableModel 与 GUI 分离

java - 阻止 BufferedWriter 覆盖现有文本行