简体   繁体   English

Spring Boot 应用程序的内部化

[英]Internalization in Spring Boot Application

Sorry for my english.对不起我的英语不好。 I am working on a spring boot application and I have the following situation.我正在开发一个 spring 启动应用程序,我有以下情况。 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 .另外我有两个属性文件messages.propertiesmessages_us.properties

And I defined a User entity class like this:我定义了一个 User 实体类,如下所示:

@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但是当我在这样的Service类中使用 @Valid 时

    @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谢谢

Assuming your saveUser service method is getting called only from the REST API endpoint method "createUser" which is already validating the USER entity.假设您的 saveUser 服务方法仅从已经验证 USER 实体的 REST API 端点方法“createUser”中调用。 I do not see any need for using @Valid in the service method argument as well.我也认为不需要在服务方法参数中使用 @Valid 。 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/这篇文章可能对您有所帮助 - https://auth0.com/blog/exception-handling-and-i18n-on-spring-boots-apis/

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM