2016-10-13 12 views
5

Tôi đang cố gắng lấy các đối số của một phương thức bộ điều khiển grails bằng cách sử dụng chú thích và một Aspect thực thi trước phương thức. Trình xử lý khía cạnh thực thi chính xác nhưng tôi không thể truy cập đối số (thực hiện grails.validation.Validateable) danh sách đối số trống.Grails 3.0.11 Chú thích AOP để xử lý trước commandObjects trước các phương thức Controller

experiment.aspect.validated

package experiment.aspect 

import java.lang.annotation.ElementType 
import java.lang.annotation.Retention 
import java.lang.annotation.RetentionPolicy 
import java.lang.annotation.Target 

/** 
* Created by Vaggelis on 10/13/2016. 
*/ 

@Target(ElementType.METHOD) 
@Retention(RetentionPolicy.RUNTIME) 
@interface Validated { 

} 

experiment.aspect.ValidatedAspect

package experiment.aspect 


import grails.validation.ValidationException 
import org.aspectj.lang.JoinPoint 

import org.aspectj.lang.annotation.Aspect 
import org.aspectj.lang.annotation.Before 


/** 
* Created by Vaggelis on 10/13/2016. 
*/ 
@Aspect 
class ValidatedAspect { 

    @Before("@annotation(experiment.aspect.Validated)") 
    public void preValidate(JoinPoint point) throws ValidationException{ 

     println "parameters ${point.getArgs()}" 


    } 
} 

conf.spring.resources

import experiment.aspect.ValidatedAspect 

// Place your Spring DSL code here 
beans = { 
    validatedAspect(ValidatedAspect) 
} 

controllers.experiment.TestController

package experiment 
import experiment.aspect.Validated 
class TestController extends BaseController { 
    static responseFormats = ['json'] 
    @Validated 
    def login(LoginCommand loginCommand){ 
     println "Validated" 
     ... 
    } 

} 

experiment.LoginCommand

package experiment 

/** 
* Created by Vaggelis on 9/14/2016. 
*/ 
import grails.validation.Validateable 


class LoginCommand implements Validateable { 
// String id 
    String name 
    static constraints = { 
     name blank: false 
    } 
} 

tôi nhận được đầu ra sau, có nghĩa là phương pháp xử lý khía cạnh chạy trước khi phương pháp điều khiển nhưng nó không có được các đối số.

parameters [] 
Validated 

Trả lời

2

Bạn không thấy arg vì không có.

Để hỗ trợ dữ liệu và đơn giản hơn khi servlet quyết định bộ điều khiển và phương thức cần gọi, biến đổi AST tạo phương thức mới có cùng tên và không có arg cho tất cả các phương thức hành động có bất kỳ arg nào. Phương thức zero-arg là phương thức được gọi ban đầu bởi servlet, và nó có logic được thêm vào bởi phép biến đổi để thực hiện các cuộc gọi liên kết dữ liệu. Sau khi thực hiện xong, nó sẽ gọi phương thức parameterized của bạn với các chuỗi param được chuyển đổi thành int/long/boolean/command objects/etc.

Phương pháp no-arg cũng sẽ được chú thích với @grails.web.Action và các loại arg được chỉ định trong thuộc tính commandObjects. Điều này sẽ giúp tìm ra phương thức khác, nhưng nó thực sự đơn giản vì bạn sẽ gặp lỗi trình biên dịch nếu bạn khai báo các phương thức công khai quá tải. Đã nói tất cả điều đó, bạn có thể không muốn sử dụng phương pháp này ngay cả khi nó đã hoạt động - đã có hai cách tiêu chuẩn hiện có để chặn các cuộc gọi hành động điều khiển, bộ lọc Grails (bây giờ là bộ chặn trong 3.x) và bộ lọc servlet . Bộ lọc Grails và interceptors làm cho nó tầm thường để kiểm tra và tùy chọn thêm, sửa đổi hoặc xóa các tham số yêu cầu, và nếu bạn trả về false từ cuộc gọi 'before', bạn sẽ ngăn Grails xử lý yêu cầu (ví dụ như bạn tự trả lại hoặc gửi chuyển hướng) , vv)

+0

Điều đó có nghĩa là cả hai phương pháp đều sẽ được chú thích? Tôi biết về những kẻ đánh chặn, chúng rất tuyệt nhưng không phải thứ tôi muốn sử dụng cho việc này. – Evan

+1

Không, nó được sử dụng để đánh dấu các hành động có thể gọi - các phương pháp đã gõ có hiệu quả không công khai –

+0

Tuyệt vời :( Nhưng điều đó có nghĩa là nếu tôi muốn ghi lại thời lượng của hành động bằng cách sử dụng chú thích Arround, tôi sẽ chỉ đếm thời gian Để thực hiện phương pháp no-arg – Evan

Các vấn đề liên quan