package ameba.validation; import ameba.core.Application; import ameba.i18n.Messages; import org.glassfish.jersey.server.ServerProperties; import org.glassfish.jersey.server.validation.ValidationConfig; import org.glassfish.jersey.server.validation.internal.InjectingConstraintValidatorFactory; import org.glassfish.jersey.server.validation.internal.ValidationBinder; import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator; import org.hibernate.validator.parameternameprovider.ParanamerParameterNameProvider; import org.hibernate.validator.spi.resourceloading.ResourceBundleLocator; import javax.inject.Inject; import javax.ws.rs.container.ResourceContext; import javax.ws.rs.core.Context; import javax.ws.rs.core.Feature; import javax.ws.rs.core.FeatureContext; import javax.ws.rs.ext.ContextResolver; /** * <p>ValidationFeature class.</p> * * @author icode * */ public final class ValidationFeature implements Feature { /** * Constant <code>VALIDATION_MESSAGE_BUNDLE_NAME="Messages.BUNDLE_DIR + validationMessage"</code> */ public static final String VALIDATION_MESSAGE_BUNDLE_NAME = Messages.BUNDLE_DIR + "validationMessage"; /** {@inheritDoc} */ @Override public boolean configure(final FeatureContext context) { // disable Jersey default BeanValidation feature context.property(ServerProperties.BV_FEATURE_DISABLE, "true"); context.register(new ValidationBinder()) .register(ValidationExceptionMapper.class) .register(ValidationConfigurationContextResolver.class); return true; } public static class ValidationConfigurationContextResolver implements ContextResolver<ValidationConfig> { @Inject private Application.Mode mode; @Context private ResourceContext resourceContext; @Override public ValidationConfig getContext(final Class<?> type) { return new ValidationConfig() .constraintValidatorFactory(resourceContext.getResource(InjectingConstraintValidatorFactory.class)) .parameterNameProvider(new ParanamerParameterNameProvider()) .messageInterpolator( new ResourceBundleMessageInterpolator( buildBundleLocator(VALIDATION_MESSAGE_BUNDLE_NAME), buildBundleLocator(Messages.BUNDLE_NAME), mode.isProd() ) ); } private ResourceBundleLocator buildBundleLocator(final String name) { return locale -> Messages.getResourceBundle(name, locale); } } }