Message localization in controller

Hi,

I’m trying to get some localized messages in my controller, but somehow the controller can’t “find” them. Here’s the controller:

package com.company.kdodatabase.web.kdoinitiatie;

import com.company.kdodatabase.web.toolkit.ui.RatingFieldServerComponent;
import com.haulmont.cuba.gui.components.ValidationErrors;
import com.haulmont.cuba.gui.screen.*;
import com.company.kdodatabase.entity.KDOInitiatie;
import com.haulmont.cuba.gui.components.VBoxLayout;
import com.vaadin.ui.Layout;

import javax.inject.Inject;

@UiController("kdodatabase_KDOInitiatie.edit")
@UiDescriptor("kdo-initiatie-edit.xml")
@EditedEntityContainer("kDOInitiatieDc")
@LoadDataBeforeShow
public class KDOInitiatieEdit extends StandardEditor<KDOInitiatie> {
    @Inject
    private VBoxLayout scoreSpecifiekBox, scoreMeetbaarBox, scoreAcceptabelBox, scoreRealistischBox, scoreTijdgebondenBox;
    private RatingFieldServerComponent ratingFieldSpecifiek = new RatingFieldServerComponent();
    private RatingFieldServerComponent ratingFieldMeetbaar = new RatingFieldServerComponent();
    private RatingFieldServerComponent ratingFieldAcceptabel = new RatingFieldServerComponent();
    private RatingFieldServerComponent ratingFieldRealistisch = new RatingFieldServerComponent();
    private RatingFieldServerComponent ratingFieldTijdgebonden = new RatingFieldServerComponent();

    @Subscribe
    protected void onInit(InitEvent event) {
        scoreSpecifiekBox.unwrap(Layout.class).addComponent(ratingFieldSpecifiek);
        scoreMeetbaarBox.unwrap(Layout.class).addComponent(ratingFieldMeetbaar);
        scoreAcceptabelBox.unwrap(Layout.class).addComponent(ratingFieldAcceptabel);
        scoreRealistischBox.unwrap(Layout.class).addComponent(ratingFieldRealistisch);
        scoreTijdgebondenBox.unwrap(Layout.class).addComponent(ratingFieldTijdgebonden);

        ratingFieldSpecifiek.addValueChangeListener(valueChangeEvent ->
                getEditedEntity().setScore_specifiek(valueChangeEvent.getValue()));
        ratingFieldMeetbaar.addValueChangeListener(valueChangeEvent ->
                getEditedEntity().setScore_meetbaar(valueChangeEvent.getValue()));
        ratingFieldAcceptabel.addValueChangeListener(valueChangeEvent ->
                getEditedEntity().setScore_acceptabel(valueChangeEvent.getValue()));
        ratingFieldRealistisch.addValueChangeListener(valueChangeEvent ->
                getEditedEntity().setScore_realistisch(valueChangeEvent.getValue()));
        ratingFieldTijdgebonden.addValueChangeListener(valueChangeEvent ->
                getEditedEntity().setScore_tijdgebonden(valueChangeEvent.getValue()));
    }

    @Subscribe
    protected void onInitEntity(InitEntityEvent<KDOInitiatie> event) {
        event.getEntity().setScore_specifiek(0);
        event.getEntity().setScore_meetbaar(0);
        event.getEntity().setScore_acceptabel(0);
        event.getEntity().setScore_realistisch(0);
        event.getEntity().setScore_tijdgebonden(0);
    }

    @Override
    protected void validateAdditionalRules(ValidationErrors errors) {
        if (getEditedEntity().getScore_specifiek() < 1) {
            errors.add("msg://scoreSpecifiekValMsg");
        }
        if (getEditedEntity().getScore_meetbaar() < 1) {
            errors.add("msg://scoreMeetbaarValMsg");
        }
        if (getEditedEntity().getScore_acceptabel() < 1) {
            errors.add("msg://scoreAcceptabelValMsg");
        }
        if (getEditedEntity().getScore_realistisch() < 1) {
            errors.add("msg://scoreRealistischValMsg");
        }
        if (getEditedEntity().getScore_tijdgebonden() < 1) {
            errors.add("msg://scoreTijdgebondenValMsg");
        }

        super.validateAdditionalRules(errors);
    }
}

In the ‘validateAdditionalRules’ method, I’m trying to get some messages from the localized screen messages file, but this doesn’t work. How do I change the controller to get those messages?

Hi

You need to inject Messages bean and use its getMessages() method.
E.g.:

@Inject
protected Messages messages;
...
String message1 = messages.getMessage(getClass(), "someMessage");
String message2 = messages.getMessage("com.abc.sales.web.customer", "someMessage");

See documentation for details.