开心比较堵 2024-06-21 14:46 采纳率: 73.2%
浏览 4
已结题

在使用注解和AOP完成接口对象属性的赋值的时候,返回对象查看后发现返回的对象属性值没有成功赋值?

在使用注解和AOP完成接口对象属性的赋值的时候,返回对象查看后发现返回的对象属性值没有成功赋值。请问是什么原因呢?相关代码如下:
注解类:

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ParameterObjectAttributeAssignment {
}

切面类:

@Aspect
@Component
public class ParameterObjectAttributeAssignmentAspect {

    /**
     * 定义切点
     */
    @Pointcut("@annotation(com.ywhk.cloud.db.persistence.dao.db.note.annotations.ParameterObjectAttributeAssignment)")
    public void antoAddValue() {
    }

    /**
     * 接口对象属性自动赋值
     * @param joinPoint 切点
     */
    @Before(value = "antoAddValue()")
    public void beforeRandomValueAnnotatedMethod(JoinPoint joinPoint) {
        // 参数数组
        Object[] args = joinPoint.getArgs();
        Random random = new Random();

        for (Object arg : args) {
            Field[] fields = arg.getClass().getDeclaredFields();

            for (Field field : fields) {
                if (field.isAnnotationPresent(ParameterObjectAttributeAssignment.class)) {
                    field.setAccessible(true);
                    try {
                        if (field.getType().equals(int.class)) {
                            field.setInt(arg, 55);
                        } else if (field.getType().equals(Date.class)) {
                            field.set(arg,new Date());
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

}

user类:

public class User {

    private String name;

    private String sex;
    
    private String major;
    
    @ParameterObjectAttributeAssignment
    private int age;

Controller代码:

@PostMapping("/testAutoAddValue")
        public ResponseEntity<User> testAutoFill(@RequestBody User user) throws InterruptedException {
            return ResponseEntity.ok(user);
        }

结果:

img

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-06-21 14:46
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    在使用注解和AOP自动为对象属性赋值时,如果发现属性值没有成功赋值,可能的原因有:

    1. 注解使用不正确:确保ParameterObjectAttributeAssignment注解被正确地应用到需要自动赋值的字段上,并且注解的@Target@Retention注解设置正确。

    2. 切点表达式错误:检查@Pointcut注解中的表达式是否正确匹配到目标方法。在提供的代码中,表达式"@annotation(com.ywhk.cloud.db.persistence.dao.db.note.annotations.ParameterObjectAttributeAssignment)"应该匹配到使用了ParameterObjectAttributeAssignment注解的方法或类。如果testAutoFill方法没有使用该注解,那么切点将不会触发。

    3. 参数处理问题:在beforeRandomValueAnnotatedMethod方法中,确保参数数组args包含了正确的对象,并且这些对象的字段被正确地访问和修改。注意,如果User对象是通过@RequestBody注解接收的,那么它应该是作为单个参数传递给方法的,而不是作为参数数组。

    4. 字段访问权限:使用field.setAccessible(true)确保私有字段可以被访问和修改。

    5. 异常处理:确保在尝试设置字段值时没有抛出IllegalAccessException异常,这可能表明反射操作没有正确执行。

    6. AOP代理配置问题:确保Spring AOP的代理配置正确,ParameterObjectAttributeAssignmentAspect类被Spring容器管理,并且@Aspect@Component注解被正确使用。

    7. Spring MVC配置:检查Spring MVC的配置,确保@RestController@Controller注解被正确应用,并且请求映射正确。

    8. 调试和日志:增加日志输出或使用调试工具来跟踪beforeRandomValueAnnotatedMethod方法的执行流程,查看是否有任何异常或不正确的行为。

    9. Spring版本兼容性:检查使用的Spring版本是否支持你的AOP配置和注解使用方式。

    10. 其他配置问题:检查是否有其他Spring配置或Java设置可能影响AOP的执行。

    根据你提供的信息,我无法提供具体的链接,但以上是一些可能的原因和检查点。如果需要进一步的帮助,可以提供更多的代码细节或错误日志。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月21日
  • 已采纳回答 6月21日
  • 创建了问题 6月21日

悬赏问题

  • ¥15 使用百度地图api 位置函数报错?
  • ¥15 metamask如何添加TRON自定义网络
  • ¥66 关于川崎机器人调速问题
  • ¥15 winFrom界面无法打开
  • ¥30 crossover21 ARM64版本安装软件问题
  • ¥15 mymetaobjecthandler没有进入
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。