Spring: Не найдено ни одного сообщения по коду для locale 'en_US'

ApplicationContext-Service.xml

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
    <property name="basenames">
        <list><value>messages</value></list>
    </property>
</bean>

У меня есть messages_en_US.properties в /src/messages _en_US.properties

registerForm.passwordNotMatch=Password does not match.

Это строка кода вызывает ошибку:

binding.addError(new FieldError(REGISTER_FORM, "passwordNotMatch", messageSource.getMessage("registerForm.passwordNotMatch", null, locale)));

Ошибка: сообщение не найдено в коде 'registerForm.passwordNotMatch' для локали 'en_US'.

Что может быть неправильным?

Ответ 1

работает, если вы измените на:

classpath:messages

?

У меня возникло ощущение, что при использовании ReloadableResourceBundleMessageSource в jsp не будет найден файл свойств. добавив classpath: до того, как basename решила мою проблему.

Хорошо, хотя мой проект управлялся maven, я думаю, вы все равно можете попробовать.

Ответ 2

У меня была такая же проблема. Я пробовал classpath:, но это не помогло. Закончилось включение возврата каретки в последнюю строку моего файла свойств (поэтому курсор находится на следующей строке, которая является концом файла).

Кроме того, если вы используете Maven и поместите свой файл свойств следующим образом: /resources/xxxx.properties, каталог ресурсов автоматически втягивается в вашу сгенерированную войну, поэтому classpath: не требуется.

Ответ 3

Для тех, кто использует аннотацию @Bean для bundleMessageSource. Добавьте имя для @Bean.

name="messageSource"

Используйте то же имя, которое мы использовали для создания объекта MessageSource в классе @RestController

@RestController
public class HelloWorldController {

    @Autowired
    private MessageSource messageSource;

    @GetMapping(path = "/hello-world-internationalized")
    public String helloWorldInternationalized(@RequestHeader(name = "Accept-Language", required = false) Locale locale) {
        return messageSource.getMessage("good.morning.message", null, locale);
    }
}

Затем в классе @SpringBootApplication

@Bean(name="messageSource")//wont work without the bean name
public ResourceBundleMessageSource bundleMessageSource() {
    ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
    messageSource.setBasename("messages");
    return messageSource;
}

Ссылка на эту ссылку

Ответ 4

Я думаю, вместо <property name="basenames"> он должен быть <property name="basename">.