سؤال

أحاول إعداد مصدر رسالة مخصص لمقحة السبات من 4.1 إلى Spring 3.0. لقد قمت بإعداد التكوين اللازم:

<!-- JSR-303 -->
<bean id="validator"
    class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean">
    <property name="validationMessageSource" ref="messageSource"/>
 </bean>

يتم تقديم الترجمات من مصدر رسالتي ، ولكن يبدو أن الرموز البديلة في الرسائل نفسها يتم النظر فيها في مصدر الرسالة ، أي لـ:

my.message=the property {prop} is invalid

هناك مكالمات للبحث عن "الدعامة" في الرسائل. الخوض في ResourceBundleMessageInterpolator.interpolateMessage ألاحظ أن جافادوك ينص على:

يقوم بتشغيل الاستيفاء للرسالة وفقًا للخوارزمية المحددة في JSR 303.

ملاحظة: عمليات البحث في حزم المستخدم متكررة في حين أن عمليات البحث في الحزمة الافتراضية ليست!

هذا يبدو لي أن العودية ستحدث دائمًا لحزمة محددة من قبل المستخدم ، لذلك في الواقع لا يمكنني ترجمة الرسائل القياسية مثل الرسائل الخاصة بالحجم.

كيف يمكنني توصيل مصدر الرسائل الخاص بي وتكون قادرًا على استبدال المعلمات في الرسالة؟

هل كانت مفيدة؟

المحلول

هذا يبدو لي أن العودية ستحدث دائمًا لحزمة محددة من قبل المستخدم ، لذلك في الواقع لا يمكنني ترجمة الرسائل القياسية مثل الرسائل الخاصة بالحجم.

Hibernate Valitor's ResourceBundleMessageInterPolator إنشاء حالتين من ResourceBundLelocator (IE PlatformResourceBundLelocator) واحدة لرسائل التحقق من صحة المستخدم - UserresourceBundleLocator والآخر لرسائل التحقق من صحة JSR -303 القياسية.

أي نص يظهر داخل اثنين من الأقواس المجعد على سبيل المثال {someText} في الرسالة يتم التعامل معها على أنها استبدال. يحاول ResourceBundleMessageInterPolator العثور على قيمة المطابقة التي يمكن أن تحل محل repractionToken في ResourceBundLelocators.

  1. أولاً في userDefinedValidationMessages (وهو عودية) ،
  2. ثم في DefaultValidationMessages (وهو غير متكرر).

لذا ، إذا وضعت رسالة JSR-303 قياسية في Custom ResourceBundle تقول ، validation_erros.properties, ، سيتم استبداله برسالتك المخصصة. انظر في هذا مثال تم استبدال رسالة التحقق من صحة Notnull القياسية "قد لا تكون فارغة" برسالة MyNotnullMessage مخصصة.

كيف يمكنني توصيل مصدر الرسائل الخاص بي وتكون قادرًا على استبدال المعلمات في الرسالة؟
my.message = الخاصية {prop} غير صالح

بعد مرور كل من ResourceBundLelocators ، يجد ResourceBundleMessageInterPolator لمزيد من عمليات الاستبدال في حلولها (تم حلها بواسطة كلتا الحزمين). هذه الاستبدال ليستن ليست سوى أسماء سمات التعليقات التوضيحية, ، إذا تم العثور على مثل هذه الرابحة في ResolvedMessage ، يتم استبدالها بـ قيم مطابقة سمات التعليقات التوضيحية.

ResourceBundleMessageInterPolator.java [السطر 168 ، 4.1.0.final

resolvedMessage = replaceAnnotationAttributes( resolvedMessage, annotationParameters );

تقديم مثال لاستبدال {prop} بقيمة مخصصة ، آمل أن يساعدك ...

mynotnull.java

@Constraint(validatedBy = {MyNotNullValidator.class})
public @interface MyNotNull {
    String propertyName(); //Annotation Attribute Name
    String message() default "{myNotNull}";
    Class<?>[] groups() default { };
    Class<? extends Payload>[] payload() default {};
}

mynotnullvalidator.java

public class MyNotNullValidator implements ConstraintValidator<MyNotNull, Object> {
    public void initialize(MyNotNull parameters) {
    }

    public boolean isValid(Object object, ConstraintValidatorContext constraintValidatorContext) {
        return object != null;
    }
}

user.java

class User {
    private String userName;

    /* whatever name you provide as propertyName will replace {propertyName} in resource bundle */
   // Annotation Attribute Value 
    @MyNotNull(propertyName="userName") 
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
}

التحقق من الصحة

notNull={propertyName} cannot be null 

اختبار

public void test() {
    LocalValidatorFactoryBean factory = applicationContext.getBean("validator", LocalValidatorFactoryBean.class);
    Validator validator = factory.getValidator();
    User user = new User("James", "Bond");
    user.setUserName(null);
    Set<ConstraintViolation<User>> violations = validator.validate(user);
    for(ConstraintViolation<User> violation : violations) {
        System.out.println("Custom Message:- " + violation.getMessage());
    }
}

انتاج |

Custom Message:- userName cannot be null
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top