Jonas - Spring - Jersey REST - Bean 验证:ValidationException:未找到验证提供程序

Jonas - Spring - Jersey REST - Bean Validation : ValidationException: No Validation Provider Found

我正在使用 Jonas 5.2.4、Jersey 2.15、Spring 4.13 构建 REST 网络服务应用程序。到此为止一切都还好。应用程序按预期进行编译、部署和反应。

然后我尝试添加输入剩余资源的 Bean 验证 (JSR-303) 与这些 indications/exemples: https://jersey.java.net/documentation/latest/bean-validation.htmlhttp://blog.trifork.com/2009/08/04/bean-validation-integrating-jsr-303-with-spring/

当我添加验证依赖项时:

<dependency>
   <groupId>javax.validation</groupId>
   <artifactId>validation-api</artifactId>
   <version>1.1.0.Final</version>
</dependency>
<dependency>
   <groupId>org.glassfish.jersey.ext</groupId>
   <artifactId>jersey-bean-validation</artifactId>
   <version>2.15</version>
</dependency>

我有友情栈:

[DEBUG] 2015-02-02 11:08:31,876 org.springframework.beans.factory.support.DefaultListableBeanFactory - Invoking afterPropertiesSet() on bean with name 'beanValidator'
[WARN] 2015-02-02 11:08:31,879 org.springframework.web.context.support.XmlWebApplicationContext - Exception encountered during context initialization - cancelling refresh attempt org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'beanValidator' defined in file [C:\applications\java\jonas-full-5.2.4\EFInstance\work\webapps\jonas\single\yyyyyyRestEForce_2015.02.02-11.08.22.war\WEB-INF\classes\com\xxxxxx\crme\yyyyyyeforce\rest\BeanValidator.class]: Invocation of init method failed; nested exception is javax.validation.ValidationException: Could not create Configuration.
-  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1566)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
- at org.springframework.beans.factory.support.AbstractBeanFactory.getObject(AbstractBeanFactory.java:302)
- at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
- at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
- at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
- at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:762)
- at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
- at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
- at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:403)
- at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:306)
- at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:106)
- at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4206)
- at org.apache.catalina.core.StandardContext.start(StandardContext.java:4705)
- at org.ow2.jonas.web.tomcat6.JOnASStandardContext.start(JOnASStandardContext.java:312)
- at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:799)
- at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:779)
- at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:601)
- at org.ow2.jonas.web.tomcat6.Tomcat6Service.__doRegisterWar(Tomcat6Service.java:764)
- at org.ow2.jonas.web.tomcat6.Tomcat6Service.doRegisterWar(Tomcat6Service.java)
- at org.ow2.jonas.web.base.BaseWebContainerService.registerWar(BaseWebContainerService.java:1025)
- at org.ow2.jonas.web.base.BaseWebContainerService.registerWar(BaseWebContainerService.java:1263)
- at org.ow2.jonas.web.base.proxy.HttpOnDemandProxy.addWar(HttpOnDemandProxy.java:352)
- at org.ow2.jonas.web.base.WARDeployer.doDeploy(WARDeployer.java:70)
- at org.ow2.util.ee.deploy.impl.deployer.AbsDeployer.execute(AbsDeployer.java:93)
- at org.ow2.util.ee.deploy.impl.deployer.AbsDeployer.execute(AbsDeployer.java:91)
- at org.ow2.util.execution.helper.RunnableHelper.execute(RunnableHelper.java:77)
- at org.ow2.util.ee.deploy.impl.deployer.AbsDeployer.deploy(AbsDeployer.java:91)
- at org.ow2.util.ee.deploy.impl.deployer.DeployerManager.deploy(DeployerManager.java:148)
- at org.ow2.jonas.deployablemonitor.DeployableMonitor.checkModifiedDeployables(DeployableMonitor.java:675)
- at org.ow2.jonas.deployablemonitor.DeployableMonitor.updateArchives(DeployableMonitor.java:319)
- at org.ow2.jonas.deployablemonitor.DeployableMonitor.run(DeployableMonitor.java:213)
Caused by: javax.validation.ValidationException: Could not create Configuration.
- at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:198)
- at javax.validation.Validation.buildDefaultValidatorFactory(Validation.java:67)
- at com.xxxxxx.crme.yyyyyeforce.rest.BeanValidator.afterPropertiesSet(BeanValidator.java:23)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1625)
- at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1562)
- ... 32 more
Caused by: javax.validation.ValidationException: No Validation Provider Found. Check that a Validation Provider implementation is provided
- at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:193)
... 36 more

这是应用程序的maven树。 (从 dao 项目部分提取依赖项以确保它们随处可用):

[INFO] com.xxxxx.crme.yyyyyyEForce:yyyyyyEForceRest:war:0.0.1-SNAPSHOT
[INFO] +- com.xxxxx.crme.yyyyyyEForce:yyyyyyEForceServices:jar:0.0.1-SNAPSHOT:compile
[INFO] |  +- com.xxxxx.crme.yyyyyyEForce:yyyyyyEForceDao:jar:0.0.1-SNAPSHOT:compile
[INFO] |  |  +- org.springframework:spring-context:jar:4.1.3.RELEASE:compile
[INFO] |  |  |  +- org.springframework:spring-aop:jar:4.1.3.RELEASE:compile
[INFO] |  |  |  \- org.springframework:spring-expression:jar:4.1.3.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-webmvc:jar:4.1.3.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-orm:jar:4.1.3.RELEASE:compile
[INFO] |  |  |  +- org.springframework:spring-jdbc:jar:4.1.3.RELEASE:compile
[INFO] |  |  |  \- org.springframework:spring-tx:jar:4.1.3.RELEASE:compile
[INFO] |  |  +- org.springframework.security:spring-security-web:jar:3.1.4.RELEASE:compile
[INFO] |  |  |  +- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  |  |  \- org.springframework.security:spring-security-core:jar:3.1.4.RELEASE:compile
[INFO] |  |  +- org.hibernate:hibernate-core:jar:4.3.8.Final:compile
[INFO] |  |  |  +- org.jboss.logging:jboss-logging-annotations:jar:1.2.0.Beta1:compile
[INFO] |  |  |  +- org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:jar:1.0.0.Final:compile
[INFO] |  |  |  +- dom4j:dom4j:jar:1.6.1:compile
[INFO] |  |  |  |  \- xml-apis:xml-apis:jar:1.0.b2:compile
[INFO] |  |  |  +- org.hibernate.common:hibernate-commons-annotations:jar:4.0.5.Final:compile
[INFO] |  |  |  +- org.hibernate.javax.persistence:hibernate-jpa-2.1-api:jar:1.0.0.Final:compile
[INFO] |  |  |  +- antlr:antlr:jar:2.7.7:compile
[INFO] |  |  |  \- org.jboss:jandex:jar:1.1.0.Final:compile
[INFO] |  |  \- org.jboss.logging:jboss-logging:jar:3.2.0.Final:compile
[INFO] |  +- org.glassfish.jersey.containers:jersey-container-servlet:jar:2.15:compile
[INFO] |  |  +- org.glassfish.jersey.containers:jersey-container-servlet-core:jar:2.15:compile
[INFO] |  |  +- org.glassfish.jersey.core:jersey-common:jar:2.15:compile
[INFO] |  |  |  +- javax.annotation:javax.annotation-api:jar:1.2:compile
[INFO] |  |  |  +- org.glassfish.jersey.bundles.repackaged:jersey-guava:jar:2.15:compile
[INFO] |  |  |  \- org.glassfish.hk2:osgi-resource-locator:jar:1.0.1:compile
[INFO] |  |  \- org.glassfish.jersey.core:jersey-server:jar:2.15:compile
[INFO] |  |     \- org.glassfish.jersey.core:jersey-client:jar:2.15:compile
[INFO] |  +- org.glassfish.jersey.media:jersey-media-json-jackson:jar:2.15:compile
[INFO] |  |  +- com.fasterxml.jackson.jaxrs:jackson-jaxrs-base:jar:2.3.2:compile
[INFO] |  |  |  +- com.fasterxml.jackson.core:jackson-core:jar:2.3.2:compile
[INFO] |  |  |  \- com.fasterxml.jackson.core:jackson-databind:jar:2.3.2:compile
[INFO] |  |  +- com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:jar:2.3.2:compile
[INFO] |  |  |  \- com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:2.3.2:compile
[INFO] |  |  \- com.fasterxml.jackson.core:jackson-annotations:jar:2.3.2:compile
[INFO] |  +- com.sun.jersey:jersey-json:jar:1.18.2:compile
[INFO] |  |  +- org.codehaus.jettison:jettison:jar:1.1:compile
[INFO] |  |  +- com.sun.xml.bind:jaxb-impl:jar:2.2.3-1:compile
[INFO] |  |  |  \- javax.xml.bind:jaxb-api:jar:2.2.2:compile
[INFO] |  |  |     +- javax.xml.stream:stax-api:jar:1.0-2:compile
[INFO] |  |  |     \- javax.activation:activation:jar:1.1:compile
[INFO] |  |  +- org.codehaus.jackson:jackson-core-asl:jar:1.9.2:compile
[INFO] |  |  +- org.codehaus.jackson:jackson-mapper-asl:jar:1.9.2:compile
[INFO] |  |  +- org.codehaus.jackson:jackson-jaxrs:jar:1.9.2:compile
[INFO] |  |  +- org.codehaus.jackson:jackson-xc:jar:1.9.2:compile
[INFO] |  |  \- com.sun.jersey:jersey-core:jar:1.18.2:compile
[INFO] |  +- org.glassfish.jersey.ext:jersey-spring3:jar:2.15:compile
[INFO] |  |  +- org.springframework:spring-beans:jar:3.2.3.RELEASE:compile
[INFO] |  |  +- org.springframework:spring-core:jar:3.2.3.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-web:jar:3.2.3.RELEASE:compile
[INFO] |  +- org.glassfish.hk2.external:javax.inject:jar:2.4.0-b06:compile
[INFO] |  +- org.glassfish.hk2:hk2-api:jar:2.4.0-b06:compile
[INFO] |  |  +- javax.inject:javax.inject:jar:1:compile
[INFO] |  |  +- org.glassfish.hk2:hk2-utils:jar:2.4.0-b06:compile
[INFO] |  |  \- org.glassfish.hk2.external:aopalliance-repackaged:jar:2.4.0-b06:compile
[INFO] |  +- org.glassfish.hk2:hk2-locator:jar:2.4.0-b06:compile
[INFO] |  |  \- org.javassist:javassist:jar:3.18.1-GA:compile
[INFO] |  +- org.glassfish.hk2:hk2:jar:2.4.0-b06:compile
[INFO] |  |  +- org.glassfish.hk2:config-types:jar:2.4.0-b06:compile
[INFO] |  |  +- org.glassfish.hk2:core:jar:2.4.0-b06:compile
[INFO] |  |  +- org.glassfish.hk2:hk2-config:jar:2.4.0-b06:compile
[INFO] |  |  |  \- org.jvnet:tiger-types:jar:1.4:compile
[INFO] |  |  +- org.glassfish.hk2:hk2-runlevel:jar:2.4.0-b06:compile
[INFO] |  |  \- org.glassfish.hk2:class-model:jar:2.4.0-b06:compile
[INFO] |  |     \- org.glassfish.hk2.external:asm-all-repackaged:jar:2.4.0-b06:compile
[INFO] |  +- org.glassfish.hk2:spring-bridge:jar:2.4.0-b06:compile
[INFO] |  +- javax.validation:validation-api:jar:1.1.0.Final:compile
[INFO] |  +- org.glassfish.jersey.ext:jersey-bean-validation:jar:2.15:compile
[INFO] |  |  +- org.hibernate:hibernate-validator:jar:5.1.2.Final:compile
[INFO] |  |  |  \- com.fasterxml:classmate:jar:1.0.0:compile
[INFO] |  |  +- javax.el:javax.el-api:jar:2.2.4:compile
[INFO] |  |  \- org.glassfish.web:javax.el:jar:2.2.4:compile
[INFO] |  \- javax.ws.rs:javax.ws.rs-api:jar:2.0.1:compile
[INFO] +- log4j:log4j:jar:1.2.17:compile
[INFO] +- junit:junit:jar:4.11:test
[INFO] |  \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] \- org.mockito:mockito-all:jar:1.10.8:test

当然,我已经进行了建议的更改: - bean 验证器 class

package com.xxxxx.crme.yyyyyeforce.rest;
import java.util.Set;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;
import javax.validation.ConstraintViolation;

import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;

@Component
public class BeanValidator implements 
        org.springframework.validation.Validator, 
        InitializingBean {

    private Validator validator;

    public void afterPropertiesSet() throws Exception {
        ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory();
        validator = validatorFactory.usingContext().getValidator();
    }

    public boolean supports(Class clazz) {
        return true;
    }

    public void validate(Object target, Errors errors) {
        Set<ConstraintViolation<Object>> constraintViolations = validator.validate(target);
        for (ConstraintViolation<Object> constraintViolation : constraintViolations) {
            String propertyPath = constraintViolation.getPropertyPath().toString();
            String message = constraintViolation.getMessage();
            errors.rejectValue(propertyPath, "", message);
        }
    }
}

控制器 class 管理休息请求:

package com.xxxxx.crme.yyyyyeforce.rest;

/** Classe <code>CountryResource</code><br /> */
@Path("/country")
@Controller
public class CountryResource {
    Logger logger = Logger.getLogger(CountryServiceImpl.class) ;

    @Autowired @Qualifier("countryService")
    private CountryService countryService ;

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Response getAllCountries() {
        logger.debug("CountryResource - recherche de tous les pays");
        List<CountryDto> countryDtos = null ;
        Response serviceResponse = null ;
        if (countryService!=null) {
            try {
                countryDtos = countryService.getAllCountries();
                if (countryDtos != null) {
                    serviceResponse = Response.status(Response.Status.OK).
                        entity(countryDtos).
                        build();
                } else {
                    serviceResponse = Response.status(Response.Status.NO_CONTENT).entity("Numl list returned").build();
                }
            } catch (NoSuchElementException nse) {
                serviceResponse = Response.status(Response.Status.NO_CONTENT).entity(nse.getMessage()).build();

            } catch (InternalServerErrorException ise) {
                serviceResponse = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(ise.getMessage()).build();
            }
        } else {
            serviceResponse = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("CountryService not available").build();
        }
        return serviceResponse;
    }

    /**Methode <code>getCountryByCode</code>*/
    @GET
    @Produces(MediaType.APPLICATION_JSON)
    @Path("{code}")
    public Response getCountryByCode(@PathParam("code")
                @Pattern(regexp = "[A-Z]{3}", message = "The code must made of three capital letter")
                String code) {
        logger.debug("CountryResource - recherche du pays "+ code);
        Response serviceResponse = null ;
        CountryDto countryDto = null ; 
        if (countryService!=null) {
            try {
                countryDto = countryService.getCountryByCode(code) ;
                if (countryDto != null) {
                    serviceResponse = Response.status(Response.Status.OK).
                        entity(countryDto).
                        build();
                    logger.debug("CountryResource - Retourne pays "+ countryDto.toString());
                } else {
                    serviceResponse = Response.status(Response.Status.NOT_ACCEPTABLE).entity("Invalid contry found").build();
                }
            } catch (NoSuchElementException nse) {
                serviceResponse = Response.status(Response.Status.NO_CONTENT).entity("No content found").build();
                logger.debug("CountryResource - Pas de pays correspondant ");

            } catch (IllegalArgumentException iae) {
                serviceResponse = Response.status(Response.Status.NOT_ACCEPTABLE).entity("Invalid country code").build();
            }
        } else {
            serviceResponse = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("CountryService not available").build();
        }
        return serviceResponse ;
    }

    @POST
    @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
    @Produces(MediaType.TEXT_HTML)
    public Response createCountry(@Valid CountryDto countryDto) {
        Response serviceResponse = null ;
        if (countryService!=null) {
            try {
                if (countryService.createCountry(countryDto)) {
                    serviceResponse = Response.status(Response.Status.CREATED).entity(countryDto.getLabel()+ " added").build();
                } else { 
                    serviceResponse = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Une erreur est survenue lors du traitement").build() ;
                }
            } catch (InternalServerErrorException e) {
                e.printStackTrace();
                serviceResponse = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("Une erreur est survenue:"+ e.getCause() +" - "+ e.getMessage()).build();           
            }
        } else {
            /** Erreur d'injection spring */
            serviceResponse = Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity("CountryService not available").build();            
        }
        return serviceResponse ;
    }
}

class 配置验证(直接来自示例;为简短起见删除注释):

package com.xxxxxx.crme.yyyyyyeforce.rest;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.List;
import javax.validation.ParameterNameProvider;
import javax.validation.Validation;
import javax.ws.rs.container.ResourceContext;
import javax.ws.rs.core.Context;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;
import org.glassfish.jersey.server.validation.ValidationConfig;
import org.glassfish.jersey.server.validation.internal.InjectingConstraintValidatorFactory;

/**Custom configuration of validation.*/
@Provider
public class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> {

    @Context
    private ResourceContext resourceContext;    

    /**Get a context*/
    @Override
    public ValidationConfig getContext(Class<?> type) {
        final ValidationConfig config = new ValidationConfig();
        config.constraintValidatorFactory(resourceContext.getResource(InjectingConstraintValidatorFactory.class));
        config.parameterNameProvider(new CustomParameterNameProvider());
        return config;
    }

    private class CustomParameterNameProvider implements ParameterNameProvider {
        private final ParameterNameProvider nameProvider;
        public CustomParameterNameProvider() {
            nameProvider = Validation.byDefaultProvider().configure().getDefaultParameterNameProvider();
        }

        @Override
        public List<String> getParameterNames(final Constructor<?> constructor) {
            return nameProvider.getParameterNames(constructor);
        }

        @Override
        public List<String> getParameterNames(final Method method) {
            return nameProvider.getParameterNames(method);
        }
    }
}

Class 注册 REST 配置

 package com.xxxxxx.crme.yyyyyyyeforce.rest;
 import org.apache.log4j.Logger;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.server.spring.scope.RequestContextFilter;
 import com.xxxxxx.crme.yyyyyyyeforce.services.exceptions.ConstraintViolationExceptionMapper;
 import com.xxxxxx.crme.yyyyyyyeforce.services.exceptions.IllegalArgumentExceptionMapper;
 import com.xxxxxx.crme.yyyyyyyeforce.services.exceptions.NoSuchElementExceptionMapper;

/** */
public class EFacadeApplication extends ResourceConfig {

    /** Register JAX-RS application components. */
    public EFacadeApplication() {

        register(ValidationConfigurationContextResolver.class) ;
        register(RequestContextFilter.class);

        register(IllegalArgumentExceptionMapper.class);
        register(NoSuchElementExceptionMapper.class);
        register(ConstraintViolationExceptionMapper.class);

        register(CountryResource.class) ;
    }
}

申请的web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
                        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
    version="2.5">
    <display-name>yyyyyy EForce</display-name>
    <listener>
        <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
    </listener>
    <context-param>
        <param-name>log4jConfigLocation</param-name>
        <param-value>classpath:config/log4j.properties</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:config/applicationContext.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>jersey-config-serlvet</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.xxxxxx.crme.yyyyyyeforce.rest.YYYYYYApplication</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.xxxxxx.crme</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.beanValidation.enableOutputValidationErrorEntity.server</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>jersey-config-serlvet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
</web-app>

和spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"

    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <bean id="illegalArgumentExceptionMapper" class="com.xxxxxx.crme.yyyyyyeforce.services.exceptions.IllegalArgumentExceptionMapper" />
    <bean id="noSuchElementExceptionMapper" class="com.xxxxxx.crme.yyyyyyeforce.services.exceptions.NoSuchElementExceptionMapper" />

    <context:component-scan base-package="com.xxxxxx.crme.*" />
    <bean id="poxDataSource" class="org.springframework.jndi.JndiObjectFactoryBean" scope="singleton">
        <property name="jndiName" value="poxBackDS" />
        <property name="resourceRef" value="true" />        
    </bean>

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="poxDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.xxxxxx.crme.yyyyyyeforce.models.Country</value>
            </list>
        </property> 
    </bean>

    <tx:annotation-driven />
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
        <property name="basename" value="classpath:errors/validationMessages.properties" />
    </bean>

    <bean id="countryService" class="com.xxxxxx.crme.yyyyyyeforce.services.impl.CountryServiceImpl" /> 
    <bean id="countryDao" class="com.xxxxxx.crme.yyyyyyeforce.dao.impl.CountryDaoImpl" /> 
</beans>

特定构建的 Jonas class 排除在应用程序之外(使用 app.jars):

<filter-name>org.apache.commons.digester.*</filter-name>
<filter-name>org.springframework.*</filter-name> 
<filter-name>org.hibernate.*</filter-name>
<filter-name>org.glassfish.*</filter-name>
<filter-name>javax.validation.*</filter-name>

Jonas 服务已激活:

jonas.services    jtm,db,security,resource,ejb3,web,ear,depmonitor

在此配置中,应用程序编译未显示错误。当我尝试在服务器上部署它时,我得到了如上所示的堆栈。谁能帮我找出我哪里错了……或者我错过了实施的哪一部分。

谢谢

感谢指出 pb 位置的医生:服务器正在使用他自己的 class 并为我提供了检查方法。

Jonas class 过滤文件(classloader-default-filtering.xml) 我正在编辑的不是服务器使用的文件。由于奇怪的原因,它没有在当前配置文件夹中使用 classloader-default-filtering.xml,而是在 [JONAS_ROOT]/EFInstance/conf.

添加 javax.validation.* 到这个问题(大致)解决了这个问题。第二步是了解为什么它不关心正确的文件。