Search code examples
javaspringjstlel

Jstl equals String in validation Spring


I'm using properties to make the multi-language error alert for validation ( Annotation and Spring) And I want to check @NotBlank and @Size of it But evenwhen I use

<c:set var="checkusername"><form:errors path="username"/></c:set>
<c:if test="${checkusername == 'username.id'}">
   div class="loi"><s:message code="global.check.username"/></div>
</c:if>
<c:if test="${checkusername == 'username.length'}">
   div class="loi"><s:message code="global.check.usernamelength"/></div>
</c:if>

or

<c:set var="checkusername"><form:errors path="username"/></c:set>
<c:if test="${checkusername eq 'username.id'}">
   div class="loi"><s:message code="global.check.username"/></div>
</c:if>
<c:if test="${checkusername eq 'username.length'}">
   div class="loi"><s:message code="global.check.usernamelength"/></div>
</c:if>

The result from the comparision,it's awlays false so it doesn't work as a I expected It does work if I test it as a <c:if test="${not empty checkusername}"> but it won't help me since i want to check the length of it as well.

This is my properties code:

global_vi.properties

global.check.username=Không được để username trống
global.check.usernamelength=username nhiều nhất là 50 chữ

global.properties

global.check.username=Do not leave username empty
global.check.usernamelength=Username only contain 50 words

My model User :

@Entity
@Table(name = "Users")
public class User  {

    @Id
    @Column(name = "username")
    @NotBlank(message = "username.id")
    @Size(min=0,max=50,message="username.length")
    private String username;

    @Column(name = "password")
    @NotBlank(message = "Không được để trống mật khẩu")
    private String password;

    @Column(name = "fullname")
    @NotBlank(message = "Không được để trống họ tên")
    private String fullname;

    public User() {

    }

    public User(String username, String password) {
        this.username = username;
        this.password = password;
    }

    public User(String username, String password, String fullname) {
        this.username = username;
        this.password = password;
        this.fullname = fullname;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getFullname() {
        return fullname;
    }

    public void setFullname(String fullname) {
        this.fullname = fullname;
    }

Solution

  • You can show multi-locale error messages using bean validation.

    You need few configuration to achieve this.

    @Bean(name = "messageSource")
    public ReloadableResourceBundleMessageSource validationMessageSource() {
        ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:global");
        ...
        return messageSource;
    }
    

    This will get the error messages from the appropriate locale file.

    @Bean
    public LocaleResolver localeResolver(){
        SessionLocaleResolver r = new SessionLocaleResolver();
        r.setDefaultLocale(Locale.US);
        return r;
    }
    

    Need to register our LocaleResolver as a bean

    @Override
    public void addInterceptors (InterceptorRegistry registry) {
        LocaleChangeInterceptor l = new LocaleChangeInterceptor();
        l.setParamName("localeCode");
        registry.addInterceptor(l);
    }
    

    This interceptor can change the current locale of underlying LocaleResolver on every request only if a specified request parameter (set by LocaleChangeInterceptor.setParamName(..)) is present in the HTTP request.

    and

    ...
    @NotBlank(message = "{global.check.username}")
    @Size(min=0,max=50,message="{global.check.usernamelength}")
    private String username;
    
    @NotBlank(message = "{global.check.username}")
    private String password;
    ...