Хотя ответы, похоже, работают для людей, если вы используете Spring Security, я нашел расширение LoginUrlAuthenticationEntryPoint и добавление определенного кода для более эффективного управления AJAX. Большинство примеров перехватывают все перенаправляют не только неудачи аутентификации. Это было нежелательно для проекта, над которым я работаю. Возможно, вам также потребуется расширить ExceptionTranslationFilter и переопределить метод sendStartAuthentication, чтобы удалить шаг кэширования, если вы не хотите, чтобы сбойный запрос AJAX был кеширован.
Пример AjaxAwareAuthenticationEntryPoint:
public class AjaxAwareAuthenticationEntryPoint extends
LoginUrlAuthenticationEntryPoint {
public AjaxAwareAuthenticationEntryPoint(String loginUrl) {
super(loginUrl);
}
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException {
if (isAjax(request)) {
response.sendError(HttpStatus.UNAUTHORIZED.value(), "Please re-authenticate yourself");
} else {
super.commence(request, response, authException);
}
}
public static boolean isAjax(HttpServletRequest request) {
return request != null && "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
}
}
Вам необходимо использовать свойство persistenceXmlLocations
(обратите внимание на множественное число), а не persistenceXmlLocation
. Это строковый массив, поэтому он будет автоматически преобразован из списка:
<bean id="persistenceUnitManager"
class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
<property name="persistenceXmlLocations"><list>
<value>classpath*:config/persistence.local.xml</value>
<value>classpath*:config/persistence.remote.xml</value>
</list></property>
...
Обновление (на основе редактирования)
В вашем entityManagerFactory
не указано свойство persistenceUnitName
. Вы должны сделать это явно, потому что вы определяете более одной единицы сохранения состояния, а entityManagerFactory
должен знать, какой из них использовать.
Если вы последуете этому руководству, http://www.javacodegeeks.com/2010/05/jboss-42x-spring-3-jpa-hibernate.html вы можете внести следующие изменения для доступа к двум различным базам данных:
для каждого DAO, к которому вы хотите получить доступ, вторая база данных включает следующее:
@Autowired
частный EntityManagerFactory entityManagerFactoryDB2;
@PostConstruct
public void init () {
super.setEntityManagerFactory (entityManagerFactoryDB2);
}
Вот и все!
В весенних классах обслуживания используйте DAO как обычно!
Джастин, номер 3 можно сделать более стандартным способом, например:
В контексте Spring:
В ваших управляемых Spring DAO (обратите внимание на свойство unitName):
@PersistenceContext (unitName = "pu1" `) protected EntityManager entityManager;
Таким образом, должным образом настроенный EntityManager, соответствующий единице сохранения состояния с именем «pu1», будет внедрен в соответствующие DAO.