我想为使用特定注释注释的私有方法创建一个Pointcut.但是,当注释位于如下所示的私有方法时,不会触发我的方面.
@Aspect
public class ServiceValidatorAspect {
@Pointcut("within(@com.example.ValidatorMethod *)")
public void methodsAnnotatedWithValidated() {
}
@AfterReturning(
pointcut = "methodsAnnotatedWithValidated()",
returning = "result")
public void throwExceptionIfErrorExists(JoinPoint joinPoint, Object result) {
...
}
Run Code Online (Sandbox Code Playgroud)
服务接口
public interface UserService {
UserDto createUser(UserDto userDto);
}
Run Code Online (Sandbox Code Playgroud)
服务实施
public class UserServiceImpl implements UserService {
public UserDto createUser(UserDto userDto) {
validateUser(userDto);
userDao.create(userDto);
}
@ValidatorMethod
private validateUser(UserDto userDto) {
// code here
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我将注释移动到公共接口方法实现createUser,则会触发我的方面.我应该如何定义切入点或配置我的方面以使我的原始用例工作?
如果在浏览器中打开了Primefaces对话框,有没有办法告诉后备bean?
这就是我在facelet上显示一个对话框的方法:
<p:menuitem value="Click me" oncomplete="dialogWidget.show();" />
Run Code Online (Sandbox Code Playgroud)
当我从查找对话框对象ViewRoot,都dialog.isVisible()和dialog.isInView()返回true,即使未所示的对话框.或者,是否有一个标志告诉我主窗口是否显示为灰色(这是在显示模式对话框时发生的)?
背景信息:我正在试图找出显示FacesMessages的位置.我的应用程序可以在两个位置显示消息:主窗口或对话框弹出窗口.打开模式对话框时,我希望消息仅显示在对话框中.如果没有显示对话框,我希望消息显示在主窗口中.
我在我的代码中声明了记录器,如下所示:
Logger logger = LoggerFactory.getLogger(MyClass.class);
Run Code Online (Sandbox Code Playgroud)
我希望能够在运行时以编程方式更改记录器的日志级别.我已经尝试通过LogManager迭代存储库中的记录器,但它只将新的日志级别应用于在代码中实例化的记录器.如果创建了新的记录器实例,则它不使用新的日志级别.我的要求是我的Web应用程序中的日志级别需要通过管理GUI进行配置,这个新的日志级别需要应用于我的代码中的所有记录器(不包括第三方库日志记录,例如JSF,Spring,Hibernate等) .
这就是我现在正在做的,它不符合我的要求,因为它没有将日志级别应用于新实例化的记录器:
Enumeration<Logger> currentLoggers = LogManager.getCurrentLoggers();
while(currentLoggers.hasMoreElements()) {
Logger logger = currentLoggers.nextElement();
if (StringUtils.startsWith(logger.getName(), "com.my.company")) {
logger.setLevel(logLevel);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Log4j 1.2.17.
我有存储在数据库表中的树结构。该表可以存储多棵树。我需要一个查询来返回单个树中的所有节点。我使用以下站点作为资源,但其中的查询会将所有树的所有节点加载到 PersistenceContext 中(这不是加载整个表吗?)。我不想这样做,我只想加载一棵树。我如何做到这一点?
我使用 JPA 2 和 Hibernate 作为提供程序。
OpenJPA 1.2.x 使用 JPQL 选择树结构
http://www.tikalk.com/java/load-a-tree-with-jpa-and-hibernate#comment-1821
[更新] 根据@bennidi 的建议,我想知道我是否可以使用这样的东西:
@Entity
public class Node {
private String name;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "rootId")
private Node root;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "parentId")
private Node parent;
@OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@OrderBy("name")
private List<Node> children = new LinkedList<Node>();
}
Run Code Online (Sandbox Code Playgroud)
JPQL 查询:
select distinct n from Node n left join fetch n.children where n.rootId = ROOT_ID
Run Code Online (Sandbox Code Playgroud)
我有虽然问题,我应该创建一个第二个表,以保持在类似于父子关系 …
我正在开发两个Web应用程序,其中一个是服务器应用程序,另一个是客户端应用程序,两者都使用Spring Security.我的用例是这样的,用户登录服务器应用程序后,用户可以从服务器应用程序内的链接访问客户端应用程序.由于用户在点击这些链接(我的部分要求)时不必再次登录,因此我决定使用类似于Single SignOn的策略,以便将其身份验证信息从服务器应用转发到客户端应用.
在客户端应用程序上,我使用Spring Security RequestHeaderAuthenticationFilter来查找由服务器应用程序设置的自定义请求标头.
如果找到此自定义标头,是否必须进一步验证此请求是否值得信任?在Spring的预身份验证文档中, RequestHeaderAuthenticationFilter不执行任何身份验证,并假定请求来自SM_USER属性中指定的用户.我如何确保请求是真实的?
如何使用http请求中的自定义标头将用户从一个应用程序发送到另一个应用程序?重定向请求不起作用,因为标头信息将丢失.转发不起作用,因为转发的请求不通过客户端应用程序上配置的Spring Security过滤器,因此请求永远不会"经过身份验证",也不会创建会话.