为什么从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不为null,authenticatedUser的每个属性均为null。

模型(我不确定这个问题与此有关)

@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",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;
    }
}

解决方法

尝试一下,doc

@Around(
"execution(* net.inter.warp.bridge.controller.*.*(..) && " +
"args(authenticatedUser,..)"

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...