Internalization in Spring Boot Application

Tags: , ,



Sorry for my english. I am working on a spring boot application and I have the following situation. I implemented internalization and I created a following configuration class

@EnableWebMvc
@Configuration
public class WebMvcConfiguration implements WebMvcConfigurer {   

  @Bean
    public LocaleResolver localeResolver() {
        AcceptHeaderLocaleResolver localeResolver = new AcceptHeaderLocaleResolver();
        localeResolver.setDefaultLocale(new Locale("es_ES"));
        return localeResolver;
    }  
   
    @Bean
    @Override
    public Validator getValidator() {
        LocalValidatorFactoryBean bean = new LocalValidatorFactoryBean();
        bean.setValidationMessageSource(resourceBundleMessageSource());
        return bean;
    }

    
    @Bean("messageSource")
    public MessageSource resourceBundleMessageSource() {
        ReloadableResourceBundleMessageSource messageSource
                = new ReloadableResourceBundleMessageSource();
        messageSource.setBasename("classpath:messages");
        messageSource.setDefaultEncoding("UTF-8");
        return messageSource;
    }
    

}

Also I have two properties files messages.properties and messages_us.properties.

And I defined a User entity class like this:

@Entity
@Table(name = "users", uniqueConstraints = @UniqueConstraint(columnNames = "email"))
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {    

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", table = "users", nullable = false)
    private Long id;

    @NotEmpty(message = "{not.field.empty}")
    @NotNull(message = "{not.field.empty}")
    @Column(name = "name")
    private String name;

    @Column(name = "lastname", table = "users", nullable = false, length = 100)
    private String lastname;

    @Column(name = "birthday", table = "users")
    @Temporal(TemporalType.DATE)
    @NotNull(message = "birthday {not.empty.field}")
    private Date birthday;

}

When I try to test validation by calling following endpoint

    @PostMapping("/users")
    @ResponseStatus(HttpStatus.CREATED)
    public ResponseEntity<?> createUser(@Valid @RequestBody User user) {
//code...
}

If validation failes, I’m getting all error messages correctly.

{
    "timestamp": 1599168856694,
    "status": 400,
    "error": "Not validate field",
    "message": [
        "birthday Obligatory filed"
    ],
    "path": "/api/v1/users"
}

But when I use @Valid in a Service class like this

    @Override
    @Transactional()
    public User saveUser(@Valid User user) { 
//code...
}

I don’t get the translated messages error messages.

{
    "timestamp": 1599169130869,
    "status": 400,
    "error": "Not validate field",
    "message": [
        "roles {not.empty.field}",
        "birthday {not.empty.field}"
    ],
    "path": "/api/v1/users"
}

Does anybody knows what’s the issue here? Thanks

Answer

Assuming your saveUser service method is getting called only from the REST API endpoint method “createUser” which is already validating the USER entity. I do not see any need for using @Valid in the service method argument as well. The rest endpoint is already doing the needful.

This post might help you – https://auth0.com/blog/exception-handling-and-i18n-on-spring-boots-apis/



Source: stackoverflow