spring - 为什么从 AOP 传递到具有其他参数的控制器的模型的所有属性都是空的
问题描述
AOP
@Around(
"execution(* net.inter.warp.bridge.controller.*.*(.., net.inter.warp.bridge.model.User)) && " +
"args(.., authenticatedUser)"
)
public Object withAuthenticatedUser(ProceedingJoinPoint joinPoint, User authenticatedUser) throws Throwable {
System.out.println(joinPoint + " -> " + authenticatedUser);
User user = null;
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null)
user = (User) userService.loadUserByUsername(authentication.getName());
else
throw new UnauthorizedException("err 1");
if (user == null)
throw new UnauthorizedException("err 2");
return joinPoint.proceed(new Object[]{user});
}
控制器(authenticatedUser 的所有属性都为空)
package net.inter.warp.bridge.controller;
@GetMapping("/boxes/{id}")
public ResponseEntity<Box> getBoxById(@PathVariable(value = "id") Long boxId, User authenticatedUser)
throws NoDynamicTableFoundException, ResourceNotFoundException {}
控制器(这可以工作,因为除了 authenticatedUser 之外没有更多参数)
package net.inter.warp.bridge.controller;
@GetMapping("/boxes/{id}")
public ResponseEntity<Box> getBoxById(User authenticatedUser)
throws NoDynamicTableFoundException, ResourceNotFoundException {}
AOP 似乎讨厌其他参数... authenticatedUser 不为空,authenticatedUser 的每个属性都为空。
模型(我不确定这个问题是否与此有关)
@Entity
@Table(name="users")
@ToString
public class User extends AuthEntity implements UserDetails
{
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
String[] userRoles = this.roles.stream().map((role) -> role.getName()).toArray(String[]::new);
Collection<GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(userRoles);
return authorities;
}
@Override
public String getUsername() {
return this.email;
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
@Column(nullable=false)
@NotNull(message = "")
private String name;
@Column(nullable=false, unique=true)
@Email
//@NotBlank(message = "")
private String email;
@Column
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
@JsonIgnore
private String password;
@Column(length = 20, columnDefinition ="bigint")
//@NotNull(message = "")
private Long organization_id;
@ManyToOne(optional=false)
@JoinColumn(name = "organization_id",referencedColumnName="id", insertable=false, updatable=false)
//@JsonIgnore
private Organization organization;
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
//@Fetch(org.hibernate.annotations.FetchMode.SELECT)
@JoinTable(
name="user_role",
joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinColumn(name="role_id")})
private List<Role> roles;
/*
@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE)
//@Fetch(org.hibernate.annotations.FetchMode.SELECT)
@Fetch(value = FetchMode.SUBSELECT)
@JoinTable(
name="hyperbridge_resource.user_workspace",
joinColumns={@JoinColumn(name="user_id")},
inverseJoinColumns={@JoinColumn(name="workspace_id")})
private List<Workspace> workspaces;
*/
@Column(length = 1, columnDefinition ="char")
private String active;
@Column(name = "reset_token")
@JsonIgnore
private String resetToken;
@Column(name = "reset_token_time")
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "Asia/Seoul")
private LocalDateTime resetTokenTime;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Long getOrganization_id() {
return organization_id;
}
public void setOrganization_id(Long organization_id) {
this.organization_id = organization_id;
}
public Organization getOrganization() {
return organization;
}
public void setOrganization(Organization organization) {
this.organization = organization;
}
public List<Role> getRoles() {
return roles;
}
public void setRoles(List<Role> roles) {
this.roles = roles;
}
/* public List<Workspace> getWorkspaces() {
return workspaces;
}
public void setWorkspaces(List<Workspace> workspaces) {
this.workspaces = workspaces;
}*/
public String getActive() {
return active;
}
public void setActive(String active) {
this.active = active;
}
public String getResetToken() {
return resetToken;
}
public void setResetToken(String resetToken) {
this.resetToken = resetToken;
}
public LocalDateTime getResetTokenTime() {
return resetTokenTime;
}
public void setResetTokenTime(LocalDateTime resetTokenTime) {
this.resetTokenTime = resetTokenTime;
}
}
解决方案
试试这个,医生:
@Around(
"execution(* net.inter.warp.bridge.controller.*.*(..) && " +
"args(authenticatedUser,..)"
推荐阅读
- apache - 在 Elastic Beanstalk 上为 Apache 代理设置缓存控制标头
- svg - 在 timmywil panzoom 库中禁用平移而不禁用拖动
- html - HTML 文件有时无法加载
- azure-devops - 如何触发一个特定的管道以触发与该管道应用程序相对应的更改?
- c# - EF Core 内部 .NET Framework 数据提供程序错误 3
- javascript - Vuejs 在 HTML 中渲染多余的空格
- api - 如何制作导入和导出 csv 文件的 API 服务?
- netsuite - 如何在一行上为客户列出我的销售代表?
- python - WebScraping A Table 不适用于 Python Beautiful Soup
- excel - Excel VBA使用另一个字段作为文件名将数据从表导出到文本文件