当前位置: 首页 > 知识库问答 >
问题:

WebSphere 8.5.5上的RestEasy 3.0.13:Bean验证框架版本问题

夏华藏
2023-03-14

这个问题继续下去,但可以总结为:如何让Hibernate Validator5与Resteasy一起工作?JAX-RS2.0不需要bean验证1.1吗?或者它是否适用于Bean验证1.0)

我在这篇文章中给出了超出我问题范围的信息,以便重现我在这一点上所做的所有步骤和错误,希望它能帮助像我一样希望在WAS 8.5.5上拥有JAX-RS2.0(RestEasy impl)的任何人。我完全没有找到医生,所以这就是我得到的。

我目前正在尝试从Tomcat7上的Jersey 2.xx、JPA2.1转移到WAS 8.5.5上的RestEasy。我也可以尝试Apache CXF,但遇到了其他问题。

我无法在WAS中使用带有CDI的Jersey,原因是:https://java.net/jira/browse/Jersey-1933

----设置----

a)用RAD中的web模块创建ear

b)在部署描述符中,对于EAR,我将类加载器模式设置为:parent last,WAR classloader policy:module

关于c)的注意:如果我首先使用parent,那么自带的JAX-RS1.1会在我的JAX-RS2.0JAR之前加载。

关于b)的注意:如果我不使用“module”,而是使用“application”类加载器策略,我会得到这个错误

> Provider org.jboss.resteasy.plugins.servlet.ResteasyServletInitializer
> not a subtype

我在web.xml中设置了RestEasy servlet

<servlet>
    <servlet-name>Resteasy</servlet-name>
    <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>

    <init-param>
        <param-name>javax.ws.rs.Application</param-name>
        <param-value>com.mydomain.RestEasyConfig</param-value>
    </init-param>

    <init-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </init-param>

    <init-param>
        <param-name>resteasy.servlet.context.deployment</param-name>
        <param-value>true</param-value>
    </init-param>
</servlet>

<servlet-mapping>
    <servlet-name>Resteasy</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
  • 激活-1.1.1.jar
  • apache-mime4j-0.6.jar
  • commons-codec-1.6.jar
  • 通用-IO-2.1.jar
  • 通用日志-1.1.3.jar
  • Jackson-Annotations-2.4.1.jar
  • Jackson-Core-2.4.1.jar
  • Jackson-DataBind-2.4.1.jar
  • jackson-jaxrs-base-2.4.1.jar
  • jackson-jaxrs-json-provider-2.4.1.jar
  • jackson-module-jaxb-annotations-2.4.1.jar
  • javax.annotation-api-1.2.jar
  • javax.el-3.0.0.jar
  • jaxb-api-2.2.7.jar
  • jaxb-core-2.2.7.jar
  • jaxb-impl-2.2.7.jar
  • jboss-el-api_3.0_spec-1.0.0.final.jar
  • jboss-jaxrs-api_2.0_spec-1.0.0.final.jar
  • jboss-logging-3.1.4.ga.jar
  • Resteasy-Cache-Core-3.0.13.final.jar
  • Resteasy-CDI-3.0.13.final.jar
  • resteasy-client-3.0.13.final.jar
  • Resteasy-Jackson2-Provider-3.0.13.final.jar
  • resteasy-jaxb-provider-3.0.13.final.jar
  • resteasy-jaxrs-3.0.13.final.jar
  • Resteasy-Links-3.0.13.final.jar
  • Resteasy-Multipart-Provider-3.0.13.final.jar
  • resteasy-servlet-initializer-3.0.13.final.jar
  • resteasy-validator-provider-11-3.0.13.final.jar
  • stax2-api-3.1.1.jar
  • 验证-api-1.1.0.final.jar

和可选的

  • hibernate-validator-5.0.1.final.jar
  • Resteasy-HibernateValidator-Provider-3.0.13.final.jar
  • 类-0.8.0.jar

在我得到POC(概念验证)工作之前,我暂时不使用maven...所以所有这些JAR(javax.annotation 1.2例外)都来自RestEasy 3.0.13下载。

----问题-----

我遇到的问题是,当ReatEasy尝试加载配置时,它会抱怨找不到验证实现。据我所知,容器应该附带一个bean验证实现,但RestEasy找不到它。

> Caused by: javax.validation.ValidationException: Unable to create a
> Configuration, because no Bean Validation provider could be found. Add
> a provider like Hibernate Validator (RI) to your classpath.   at
> javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:271)
>   at
> org.jboss.resteasy.plugins.validation.AbstractValidatorContextResolver.getConfig(AbstractValidatorContextResolver.java:78)
  • resteasy-validator-provider-11-3.0.13.final.jar

然后我得到这个错误:

class not found : org.hibernate.validator.method.MethodValidator

所以我认为这是一个Hibernate Validator4.3类,它似乎不存在于Hibernate Validator5中。我继续,删除了Hibernate Validator jars(classmate+Hibernate validators 5),并添加了以下2个jars:

  • Hibernate-Validator-4.3.2.final.jar
  • Hibernate-Validator-Annotation-Processor-4.3.2.final.jar

我还删除了这个jar,因为hibernate Validator4.3实现了bean验证1.0。

  • 验证-api-1.1.0.final.jar

然后我的hello JAX-RS2.0服务就工作了!

有没有人对resteasy有类似的问题?有什么评论吗?

让我们看看接下来的几天还会有什么突破!(天哪,我想念Tomcat上的泽西)

额外的信息,因为我也张贴这是一个参考,为那些谁会有同样的问题...

最终JAR列表:

  • 激活-1.1.1.jar
  • apache-mime4j-0.6.jar
  • commons-codec-1.6.jar
  • 通用-IO-2.1.jar
  • 通用日志-1.1.3.jar
  • Hibernate-Validator-4.3.2.final.jar
  • Hibernate-Validator-Annotation-Processor-4.3.2.final.jar
  • Jackson-Annotations-2.4.1.jar
  • Jackson-Core-2.4.1.jar
  • Jackson-DataBind-2.4.1.jar
  • jackson-jaxrs-base-2.4.1.jar
  • jackson-jaxrs-json-provider-2.4.1.jar
  • jackson-module-jaxb-annotations-2.4.1.jar
  • javax.annotation-api-1.2.jar
  • javax.el-3.0.0.jar
  • jaxb-api-2.2.7.jar
  • jaxb-core-2.2.7.jar
  • jaxb-impl-2.2.7.jar
  • jboss-el-api_3.0_spec-1.0.0.final.jar
  • jboss-jaxrs-api_2.0_spec-1.0.0.final.jar
  • jboss-logging-3.1.4.ga.jar
  • Resteasy-Cache-Core-3.0.13.final.jar
  • Resteasy-CDI-3.0.13.final.jar
  • resteasy-client-3.0.13.final.jar
  • Resteasy-HibernateValidator-Provider-3.0.13.final.jar
  • Resteasy-Jackson2-Provider-3.0.13.final.jar
  • resteasy-jaxb-provider-3.0.13.final.jar
  • resteasy-jaxrs-3.0.13.final.jar
  • Resteasy-Links-3.0.13.final.jar
  • Resteasy-Multipart-Provider-3.0.13.final.jar
  • resteasy-servlet-initializer-3.0.13.final.jar
  • stax2-api-3.1.1.jar

ResteasyConfig.java

@ApplicationPath("/services")
public class RestEasyConfig extends Application {

    @Override
    public Set<Class<?>> getClasses() {

        Set<Class<?>> classes = new HashSet<Class<?>>();

        classes.add(TestService.class);
        return classes;

    }

}
@Path("/test")
public class TestService extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAccount() {

        String ok = "OK!";

        Map<String, String> map = new HashMap<String, String>();
        map.put("response", ok);

        Response response = Response.ok().entity(map).build();

        return response;
    }

}

结果是:

{
    "response": "OK!"
}

共有1个答案

马淳
2023-03-14

因此,resteasy提供了两个用于bean验证的提供者。

A)一个用于Bean验证1.0,使用绝对的Hibernate Validator4.x。这与JAX-RS规范无关...我想它只是一个像其他提供程序一样的提供程序。

B)另一个用于Bean Validation1.1,它尝试使用conatainer提供的Bean验证实现提供程序,使用CDI或JNDI。

Context context = new InitialContext();
validatorFactory = tmpValidatorFactory = ValidatorFactory.class.cast(context.lookup("java:comp/ValidatorFactory"));

我需要创建自己的提供者来使用我特定的(hibernate Validator5.x)Bean验证1.1实现,因为容器实现是一个1.0 IMPL。

使用org.jboss.resteasy.plugins.validation.abstractValidatorContextResolver.java作为基本代码可以很容易地完成这一工作

 类似资料:
  • 我正在验证数据访问对象类的字段。在一次尝试中,我已经开始向属性(@NotNull、@NotBlank、@Min、@Max等)添加Bean验证注释。我还有更多的注释jackson(JsonProperty(..))用于swagger库和文档(@api(...))。在我看来,这个类非常“脏”,有很多注释(每个属性至少有三个注释)。一个字段的示例: 在另一次尝试中,我使用spring的接口执行了自己的验

  • 问题内容: 我曾经遇到过Java的验证框架,您在其中编写了一种方法来保护数据类型的完整性以及对该数据类型的任何CRUD操作的自动调用此方法。 有谁知道这个框架是什么?我只是想避免对附加到数据类型的每个CRUD方法进行重复验证。 问题答案: 这是Java验证库/框架的巨大列表-http: //java-source.net/open- source/validation

  • 主要内容:创建主页面:,创建视图:,创建动作:,配置文件:,此验证是如何工作的?,基于XML的验证:现在,我们将看看如何的Struts验证框架。在Struts的核心有验证框架,协助应用程序的运行规则来执行验证执行之前的操作方法。 通常是使用Javascript来实现客户端验证。但不应单独依赖于客户端验证。最佳实践表明,验证应引入各级应用程序框架。现在,让我们来看看两种方式添加验证我们的Struts项目。 在这里,我们将采取一个例子,Employee 将被捕获的姓名和年龄使用一个简单的页面,我们将

  • 本文向大家介绍关于ThinkPhp 框架表单验证及ajax验证问题,包括了关于ThinkPhp 框架表单验证及ajax验证问题的使用技巧和注意事项,需要的朋友参考一下 之前的表单验证都是用js写的,这里也可以使用tp框架的验证。但是两者比较而言还是js验证比较好,因为tp框架验证会运行后台代码,这样运行速度和效率就会下降。    自动验证是ThinkPHP模型层提供的一种数据验证方法,可以在使用c

  • 问题内容: 题 在Mac OS X上,Python的Framework构建和非Framework构建(即标准UNIX构建)之间有什么区别?另外,每种技术都有哪些优缺点? 初步研究 这是我在发布此问题之前发现的信息: [Pythonmac-SIG]为什么需要构建Python框架 B. Grainger:“我似乎想起来,如果您想使用本机Mac GUI进行任何操作,都需要使用Python的Framewo

  • 如何对只接受字母的文本框进行编码