Как передать Injected / Autowired объект из Spring в ManagedBean? - PullRequest
0 голосов
/ 29 августа 2018

Я работаю над проектом с Spring и EJB / Primefaces и хочу передать значения из контекста Spring в управляемый bean-компонент. Я продемонстрирую с примером кода для уточнения.

Допустим, у нас есть следующий класс домена (я упрощаю его для лучшей читаемости):

public class Store {
    @JsonProperty("store_name")
    private String storeName;

    //constructors, getters and setters...
}

Причина @JsonProperty в том, что я получаю это значение из другого приложения, которое отправляет Json на следующий контроллер:

@Controller
@RequestMapping("/store")
public class StoreController {
    @Autowired
    private Store store;

    @RequestMapping(method = RequestMethod.POST)
    public String getStoreResponse(@RequestBody String store) throws JsonParseException, JsonMappingException, IOException {
        ObjectMapper mapper = new ObjectMapper();
        LOGGER.info("Store Before Post: " + store.getName());
        store = mapper.readValue(request, Store.class);
        LOGGER.info("Store After Post: " + store.getName());
        return "store";
    }

}

Я настроил компонент хранения в классе BeanConfig:

@Configuration
public class BeanConfig {

    @Bean(name = "store")
    @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
    public Store store() {
        Store store = new Store();
        store.setName("Test Store Name");
        return store;
    }
}

Это мой управляемый бин:

@ManagedBean
@SessionScoped
public class StoreView extends SpringBeanAutowiringSupport {

    private static final Logger LOGGER = LoggerFactory.getLogger(Store.class);

    //@ManagedProperty("#{store}")
    @Autowired
    private Store store;

    public void test() {
        LOGGER.info("TEST " + store.getName());
    }

    //getters and setters
}

наконец-то мой xhtml:

<h:panelGrid columns="3">
    <p:outputLabel for="j_store" value="#{messages['storeview.name']}" />
    <p:inputText id="j_store" value="#{storeView.store.name}" />
    <p:message for="j_store" />
    <h:panelGroup />
    <p:commandButton value="#{messages['storeview.test']}" action="#{storeView.test}" update="@form" ajax="false" />                                                                        
</h:panelGrid>

Когда я публикую образцы данных с помощью почтальона, регистратор выдает в первый раз:

10:35:57,433 INFO  [com.store.test.controllers.StoreController] (default task-2) Store Before Post: Test Store Name
10:35:57,488 INFO  [com.store.test.controllers.StoreController] (default task-2) Store After Post: posted store name

и, если я продолжу звонить контроллеру, я продолжаю получать «название магазина», поэтому оно сохранило значение.

Но когда я иду в store.xhtml и нажимаю кнопку тестирования, чтобы отправить форму, она по-прежнему имеет значение, заданное в файле конфигурации компонента («Имя хранилища тестов»), и с этого момента оно сохраняет значение что я отправляю в inputText.

Я подозреваю, что это связано с контекстом Spring и Faces, я не знаю, возможно ли то, что я хочу сделать. Если это так, пожалуйста, укажите, что я должен изменить, чтобы это работало, иначе, пожалуйста, предоставьте мне альтернативное решение.

Заранее спасибо.

1 Ответ

0 голосов
/ 29 августа 2018

Вы смешиваете @Autowired и @ManagedBean аннотации. @Autowired управляется Spring, а @ManagedBean - JSF. Это означает, что, вероятно, у вас будет 2 экземпляра Store, один из которых изменен контроллером, это не тот экземпляр, который используется управляемым компонентом.

Вы должны аннотировать как @ManagedProperty("#{store}") атрибут вашего магазина в управляемом компоненте и определять getter и setter. Чтобы заставить его работать, вы также должны определить средство распознавания Spring Expression Language в Face-config.xml

<application>
    <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

Поскольку сеанс jsf отличается от сеанса mvc, вы также должны использовать одноэлементную область в определении объекта Store.

@Scope(value = "singleton"........
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...