我有一个Spring Framework 4应用程序,它使用Hibernate 4.3.8作为JPA提供程序.我想使用Hibernate过滤器,因此我需要启用它们.我想在应用程序中全局执行此操作,我正在尝试使用Spring AOP.我的想法是,我可以编写一个方面,每次创建/获取会话时启用过滤器,就像在这个和这个问题中一样.
我已将spring-aop和aspectjweaver依赖项添加到我的项目中(使用Maven).我添加了以下方面.
@Aspect
@Component
public class EnableHibernateFilters {
@Pointcut("execution(* org.hibernate.SessionFactory.getCurrentSession(..))")
protected void sessionBeingFetched() {
}
@AfterReturning(pointcut = "sessionBeingFetched()", returning = "object")
public void enableFilters(JoinPoint joinPoint, Object object) {
System.out.println("!!! Enabling filters !!!"); // Never printed
Session session = (Session) object;
session.enableFilter("myFilter");
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是enableFilters从不调用上面的advice(); 既没有打印文本,也没有启用我的过滤器.我已经通过将切入点更改为我自己的一个类来验证我的方面已被检测到并且AOP在我的项目中有效.我也尝试将切入点更改为execution(* org.hibernate.SessionFactory.openSession(..)),但没有结果.
我怀疑这是由我如何设置Hibernate引起的,因为我没有SessionFactory明确配置; 相反,我建立了一个EntityManagerFactory.这是我的配置.
@Configuration
@EnableTransactionManagement
public class PersistenceConfig {
@Bean
public DataSource dataSource() throws NamingException …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何从自定义类中获取ServiceManager实例.
在控制器内部很容易:
$this->getServiceLocator()->get('My\CustomLogger')->log(5, 'my message');
Run Code Online (Sandbox Code Playgroud)
现在,我创建了一些独立的类,我需要Zend\Log在该类中检索实例.在zend framework v.1中,我是通过静态调用完成的:
Zend_Registry::get('myCustomLogger');
Run Code Online (Sandbox Code Playgroud)
如何My\CustomLogger在ZF2中检索?
我使用Spring Data JPA 1.7.1和Hibernate 4.3.7作为我的JPA提供程序.我有以下Spring Data JPA存储库:
@Repository
public interface CompanyRepository extends JpaRepository<Company, Integer> {
@EntityGraph(value = "graph.company.search.results", type = EntityGraph.EntityGraphType.FETCH)
@Query("SELECT c FROM Company c WHERE c.id IN :companyIds")
List<Company> findByCompanyIdsForSearchResults(@Param("companyIds") Set<Integer> companyIds);
}
Run Code Online (Sandbox Code Playgroud)
以下代码调用上面的存储库方法:
Set<Integer> companyIds = new HashSet<>();
companyIds.add(100000);
// companyIds.add(100001); // This line breaks the code
List<Company> companies = this.companyRepository.findByCompanyIdsForSearchResults(companyIds);
Run Code Online (Sandbox Code Playgroud)
我正在经历上述的奇怪行为.首先,如果我只在集合中放入一个ID,那么我的列表中会返回两个 Company实例,即使ID显然是唯一的.其次,如果我向集合中添加了多个ID,则代码将失败并显示以下内容NullPointerException:
java.lang.NullPointerException
org.hibernate.param.NamedParameterSpecification.bind(NamedParameterSpecification.java:67)
org.hibernate.loader.hql.QueryLoader.bindParameterValues(QueryLoader.java:616)
org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1901)
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1862)
org.hibernate.loader.Loader.executeQueryStatement(Loader.java:1839)
org.hibernate.loader.Loader.doQuery(Loader.java:910)
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:355)
org.hibernate.loader.Loader.doList(Loader.java:2554)
org.hibernate.loader.Loader.doList(Loader.java:2540)
org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2370)
org.hibernate.loader.Loader.list(Loader.java:2365)
org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:497)
org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:387)
org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:236)
org.hibernate.internal.SessionImpl.list(SessionImpl.java:1264)
org.hibernate.internal.QueryImpl.list(QueryImpl.java:103)
org.hibernate.jpa.internal.QueryImpl.list(QueryImpl.java:573)
org.hibernate.jpa.internal.QueryImpl.getResultList(QueryImpl.java:449)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native …Run Code Online (Sandbox Code Playgroud) 我有一个Spring MVC项目,我使用控制器建议来处理控制器中抛出的错误.但是,如果JSP文件中发生错误,我还想显示一个很好的错误页面(即使这确实不应该发生!).因此我在项目的web.xml文件中添加了以下内容:
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/views/application/error/view-error.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/views/application/error/view-error.jsp</location>
</error-page>
Run Code Online (Sandbox Code Playgroud)
如果我故意在JSTL中触发错误,则内容view-error.jsp会正常.但是,内容将附加到发生错误的JSP文件的输出中.例如,如果display-users.jsp在第50行发生错误,结果是在错误发生之前生成的输出(第1-50行)将在其中添加内容view-error.jsp.
这是非常不受欢迎的,因为它会生成一个时髦的错误页面.而且因为我无法分辨抛出异常的位置(如果可以,我会修复错误),那么用户看到的内容很可能看起来很糟糕.
我想这是因为输出已经在缓冲区中,可能已经发送到客户端了?有什么方法可以解决这个问题,或者可能是另一种方法吗?谢谢!
我正在Angular 2(和TypeScript)中构建一个模态组件,它将具有不同的视图/页面.它没有标签,但概念非常相似.基本上我正在努力寻找这样做的方法.
在我的模态组件中,我想输出不同的视图/页面.每个都应该是一个组件本身,因为它们没有任何共同的标记.另外,它们将从服务类中获取数据,因此我需要能够为每个视图编写特定的逻辑.
基本上我想要的是:
// Within my modal component's template
<div *ngFor="#view of views">
// Render view component here
</div>
Run Code Online (Sandbox Code Playgroud)
例如,哪里views可以是组件的数组.我的第一个主要问题是我不确定如何输出我的视图(组件)的集合.
如何在另一个组件中输出组件集合?
此外,我需要一种隐藏和显示视图的方法,这是视图唯一的共同点.我正在考虑isActive在视图中添加一个变量,并根据它显示/隐藏它们.视图组件实现ModalView接口或从基类扩展以添加此逻辑是不好的做法?从我的模态分量,我希望能够控制显示哪个观点,所以我需要的意见,有共同的这个逻辑.
我希望很清楚我想做什么.解决方案可能很简单,但是现在我对如何解决这个问题感到有些困惑.一个代码示例将非常感谢!
我有几个关于Microsoft SQL Server 2008性能的问题,主要是关于执行计划.
据MSDN称,与直接SQL查询相比,存储过程具有更好的性能,因为:
数据库可以准备,优化和缓存执行计划,以便以后可以重用执行计划.
我的第一个问题是为什么会这样.我之前已经读过,当使用参数化查询(预处理语句)时,执行计划被缓存以用于具有可能不同值(执行上下文)的后续执行.存储过程是否仍然更有效?如果是这样,存储过程的执行计划是仅按需重新创建的,还是不太可能从缓存中清除?参数化查询是否被视为ad-hoc查询,这意味着执行计划更有可能从缓存中清除?
此外,由于我仍然是这个领域的新手,我想知道是否有某些命令只适用于T-SQL.我有一个查询,在第一次运行中需要大约12秒才能完成,然后在Microsoft SQL Management Studio和ADO.NET中大约需要3秒钟.作为演示文稿的一部分,该查询应该是无效的.事情是,我的查询中,我同时使用CHECKPOINT,并DBCC DROPCLEANBUFFERS按照这篇文章也OPTION (RECOMPILE).但是,至少这两个首先似乎没有区别,因为查询仍然需要3秒.我的猜测是,这是由于数据缓存没有被清除.任何想法为什么缓存似乎没有被清除,或任何想法为什么我的查询在第一次执行后明显更快?
这些是我现在想到的问题.
随着最新发布的Zend Framework 2版本,增加了两个新的表单元素 ; DateSelect和MonthSelect.我想使用前者,它增加了三个选择; 日,月和年.但是,我有一个问题格式化输出我想要的 - 而且,没有这方面的文档!
我正在将表单元素添加到我的表单中(从此页面中获取):
$this->add(array(
'type' => 'Zend\Form\Element\DateSelect',
'name' => 'birthDate',
'options' => array(
'label' => 'Date',
'create_empty_option' => true,
'day_attributes' => array(
'data-placeholder' => 'Day',
'style' => 'width: 20%',
),
'month_attributes' => array(
'data-placeholder' => 'Month',
'style' => 'width: 20%',
),
'year_attributes' => array(
'data-placeholder' => 'Year',
'style' => 'width: 20%',
)
)
));
Run Code Online (Sandbox Code Playgroud)
对于输出,我这样做:
echo $this->formDateSelect($form->get('birthDate'));
Run Code Online (Sandbox Code Playgroud)
问题是我不知道如何控制选择的格式化方式.例如,它们目前以这种形式输出:[month] [day], [year].我想改变两件事; 首先,我想切换日期和月份,其次,我想摆脱逗号.
助手使用IntlDateFormatter该类来格式化选择.在源代码中,我注意到在调用[链接到源代码]时可以使用 …
我有很多字段集,我想为每个字段集创建一个输入过滤器类.我的想法是,对于我的每个表单,我都可以创建一个由其他输入过滤器组成的输入过滤器类.例如,在通过注册表单创建帐户时,我想Account为我的Account实体采用基本输入过滤器,并在新的输入过滤器类中使用它,可以修改输入或添加其他输入.像下面这样的东西.
class Register extends InputFilter
{
public function __construct(ObjectRepository $accountRepository, Account $accountFilter)
{
/***** Add inputs from input filters *****/
$this->inputs = $accountFilter->getInputs();
/***** Add additional validation rules *****/
// Username
$usernameAvailability = new NoObjectExists(array(
'object_repository' => $accountRepository,
'fields' => array('username'),
));
$username = $this->get('username');
$username->getValidatorChain()
->attach($usernameAvailability, true);
// E-mail
$emailAvailability = new NoObjectExists(array(
'object_repository' => $accountRepository,
'fields' => array('email'),
));
$email = $this->get('email');
$email->getValidatorChain()
->attach($emailAvailability, true);
}
}
Run Code Online (Sandbox Code Playgroud)
我将输入过滤器传递给构造函数,我想将此过滤器的输入添加到我的Register过滤器并修改输入.
我遇到的问题是,我的一些输入似乎按预期验证,我似乎无法弄清楚原因.当我提交表单时,只有一些输入按预期验证:

有趣的是,填写我的数据库中已存在的电子邮件时,电子邮件输入的行为不符合预期.结果应该是已经存在的验证错误,但这不会发生.如果我调试并查看我的表单,我发现以下内容:

表单的过滤器具有正确的输入和正确的验证器,如上图所示,username …
我有一个使用Apache Tiles的Spring MVC项目.我已实现,以便可以从这样的消息源读取标题:
<tiles-definitions>
<definition name="some-definition" extends="public.base">
<put-attribute name="title" value="some-definition.title" cascade="true" />
</definition>
</tiles-definitions>
Run Code Online (Sandbox Code Playgroud)
在我的模板文件(定义public.base)中,我执行以下操作:
<title><spring:message text="" code="${title}" /></title>
Run Code Online (Sandbox Code Playgroud)
现在这适用于静态翻译标题,但我也想支持动态标题,例如显示公司名称.我可以这样做:
<tiles-definitions>
<definition name="some-definition" extends="public.base">
<put-attribute name="title" expression="${company.name}" />
</definition>
</tiles-definitions>
Run Code Online (Sandbox Code Playgroud)
然后只需在我的模板中输出标题,如下所示:<c:out value="${title}" />.但是,问题在于我的代码中断了,因为title属性的值不再是消息键.我希望能够支持以下场景:
理想情况下,我可以在我的消息源中使用表达式语言,但我无法使用它.我已经尝试了很多种解决方案,但我似乎找不到合适的解决方案.如果我可以在我的消息源中使用表达式语言,那么这很容易.例如,是否有可能以某种方式执行以下操作?
some-definition.title = Hello there, ${company.name}
Run Code Online (Sandbox Code Playgroud)
在我的模板中:
<spring:message text="" code="some-definition.title" var="test" />
<c:out value="${test}" />
Run Code Online (Sandbox Code Playgroud)
以上不起作用,因为它输出${company.name}而不是变量的实际内容.有没有办法让这样的工作?或者还有其他方法可以支持我上面列出的方案吗?
我考虑创建一个自定义JSTL标记,我将在普通Java代码中解析字符串表达式(已翻译的字符串),但我意识到我可能必须明确指定"变量替换"的根对象才能工作,如此处所述.然后它似乎不是一个动态的解决方案.
有什么方法可以完成这项任务吗?任何帮助深表感谢!
我的locationnginx配置中有一个简单的块,它匹配我网站的静态文件.我想要做的是检查文件是否存在try_files,如果不存在,则重定向到URL(在这种情况下,在@cdn位置块中指定).我还想设置一些CORS头.
以下是相关配置.
location ~* \.(css|js|jpe?g|png|gif|otf|eot|svg|ttf|woff|woff2|xml|json)$ {
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
return 204;
}
if ($request_method = 'POST') {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
}
if ($request_method = 'GET') {
add_header 'Access-Control-Allow-Origin' "$http_origin";
add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
}
try_files $uri @cdn;
}
location @cdn {
return 301 https://example.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)
问题是,如果文件不存在,我得到404响应,而不是301重定向.在添加CORS头之前,配置工作正常.如果我删除了标题的处理,一切都按预期工作,我得到301响应.
现在我已经做了一些关于if指令为什么不好并且应该避免的解读,但我仍然不知道为什么它会破坏我的配置.如果我理解正确,它与任何一个if或与add_header重写模块或类似的东西有关,我猜这与之相冲突 …