英文:
Internalization in Spring Boot Application
问题
抱歉,我无法执行您的请求,但我可以为您提供翻译。以下是您提供的代码和内容的翻译:
抱歉,我的英语可能有些不好。我正在开发一个Spring Boot应用程序,遇到了以下情况。我已经实现了国际化,并创建了以下配置类:
@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;
}
}
此外,我有两个属性文件 messages.properties
和 messages_us.properties
。
我定义了一个用户实体类如下:
@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;
}
当我尝试通过调用以下端点来测试验证时:
@PostMapping("/users")
@ResponseStatus(HttpStatus.CREATED)
public ResponseEntity<?> createUser(@Valid @RequestBody User user) {
//代码...
}
如果验证失败,我可以正确地获得所有错误消息。
{
"timestamp": 1599168856694,
"status": 400,
"error": "Not validate field",
"message": [
"birthday Obligatory filed"
],
"path": "/api/v1/users"
}
但是,当我在 Service
类中使用 @Valid
,如下所示:
@Override
@Transactional()
public User saveUser(@Valid User user) {
//代码...
}
我无法获得翻译后的错误消息。
{
"timestamp": 1599169130869,
"status": 400,
"error": "Not validate field",
"message": [
"roles {not.empty.field}",
"birthday {not.empty.field}"
],
"path": "/api/v1/users"
}
有人知道这是什么问题吗?谢谢。
英文:
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
答案1
得分: 0
假设你的saveUser服务方法只从REST API端点方法"createUser"中被调用,该方法已经在验证了USER实体。我认为在服务方法的参数中使用@Valid 是没有必要的,因为REST端点已经做了必要的工作。
这篇文章可能对你有帮助 - https://auth0.com/blog/exception-handling-and-i18n-on-spring-boots-apis/
英文:
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/
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论