我有一个类采用枚举值,例如 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 中,我不确定它们是如何注册的,但这就是正在发生的事情。
您可以为 JsonParseException
和 JsonMappingException
编写/注册您自己的 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/