Я работаю над проектом с 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, я не знаю, возможно ли то, что я хочу сделать. Если это так, пожалуйста, укажите, что я должен изменить, чтобы это работало, иначе, пожалуйста, предоставьте мне альтернативное решение.
Заранее спасибо.