2013-04-29 33 views
5

Tôi đã thấy một số câu hỏi về chủ đề này, nhưng không có câu trả lời nào trong phần tôi bị kẹt. Nhân tiện, dựa trên những vấn đề mà mọi người đang gặp phải, tôi có thể đề nghị đưa ra một thực thi java mặc định của TemplatesPlugin sau khi tất cả.Chế độ xem tùy chỉnh trong SecureSocial trong Java

Vấn đề tôi có, là tôi sao chép hai quan điểm cần thiết từ SecureSocial vào thư mục quan điểm của tôi, và thay đổi RequestHeader như những người khác đã ghi nhận: play.api.mvc.RequestHeader và bây giờ tôi đang nhận được:

ambiguous implicit values: both method requestHeader in object PlayMagicForJava of type => play.api.mvc.RequestHeader and value request of type play.api.mvc.RequestHeader match expected type play.api.mvc.RequestHeader 

Phiên bản: Play-2.1.1, Java 7, SecureSocial từ Master.

EDIT:

Chơi Compile:

[error] C:\Java\AwsConsole\app\views\secure\login.scala.html:41: ambiguous impli 
cit values: 
[error] both method requestHeader in object PlayMagicForJava of type => play.ap 
i.mvc.RequestHeader 
[error] and value request of type play.api.mvc.RequestHeader 
[error] match expected type play.api.mvc.RequestHeader 
[error]       @provider(p.id) 
[error]        ^
[error] C:\Java\AwsConsole\app\views\secure\provider.scala.html:20: ambiguous im 
plicit values: 
[error] both method requestHeader in object PlayMagicForJava of type => play.ap 
i.mvc.RequestHeader 
[error] and value request of type play.api.mvc.RequestHeader 
[error] match expected type play.api.mvc.RequestHeader 
[error]     <form action = "@securesocial.core.providers.utils.Route 
sHelper.authenticateByPost("userpass").absoluteURL(IdentityProvider.sslEnabled)" 

[error] 
               ^
[error] two errors found 
[error] (compile:compile) Compilation failed 

Browsing sau Chơi Chạy thay vì:

Internal server error, for (GET) [/] -> 

sbt.PlayExceptions$CompilationException: Compilation error[ambiguous implicit va 
lues: 
both method requestHeader in object PlayMagicForJava of type => play.api.mvc.Re 
questHeader 
and value request of type play.api.mvc.RequestHeader 
match expected type play.api.mvc.RequestHeader] 
     at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15$$anonfun 
$apply$16.apply(PlayReloader.scala:349) ~[na:na] 
     at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15$$anonfun 
$apply$16.apply(PlayReloader.scala:349) ~[na:na] 
     at scala.Option.map(Option.scala:133) ~[scala-library.jar:na] 
     at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15.apply(Pl 
ayReloader.scala:349) ~[na:na] 
     at sbt.PlayReloader$$anon$2$$anonfun$reload$2$$anonfun$apply$15.apply(Pl 
ayReloader.scala:346) ~[na:na] 
     at scala.Option.map(Option.scala:133) ~[scala-library.jar:na] 
+0

Tôi có vấn đề này cũng như trong phiên bản 2.1.1 .. không có giải pháp nào – adis

+0

Bạn có thể vui lòng đăng thông báo lỗi đầy đủ để nó trở nên rõ ràng trong đó dòng của mẫu lỗi xảy ra. – MartinGrotzke

+0

@MartinGrotzke Cập nhật câu hỏi với dấu vết ngăn xếp từ biên dịch và chạy –

Trả lời

8

Yêu cầu phải được thông qua explicitely vào mẫu đăng nhập, mẫu đăng nhập phải chuyển yêu cầu một cách rõ ràng đến mẫu nhà cung cấp và mẫu nhà cung cấp phải chỉ định yêu cầu khi gọi RoutesHelp er.authenticateByPost ("userpass"). absoluteURL. chi tiết hơn:

  1. Các TemplatesPlugin java nên có thực hiện này getLoginPage:

    @Override 
    public <A> Html getLoginPage(final play.api.mvc.Request<A> request, final Form<Tuple2<String, String>> form, 
         final Option<String> msg) { 
        return views.html.login.render(request, form, msg); 
    } 
    
  2. Các thông số (dòng đầu tiên) của login.scala.html sẽ trông như thế này:

    @(request: play.api.mvc.RequestHeader, loginForm: play.api.data.Form[(String,String)], errorMsg: Option[String] = None) 
    
  3. Thay đổi cuộc gọi từ login.scala.html đến mẫu provider để chuyển yêu cầu một cách rõ ràng (chúng tôi sẽ điều chỉnh thông số của yêu cầu đó ers trong bước tiếp theo).

    1. login.scala.html dòng 41, thay đổi

      @provider(p.id) 
      

      để

      @provider(request, p.id) 
      
    2. login.scala.html dòng 55, thay đổi

      @provider("userpass", Some(loginForm)) 
      

      để

      @provider(request, "userpass", Some(loginForm)) 
      
  4. Các thông số (dòng đầu tiên) của provider.scala.html nên yêu cầu như lần đầu tiên tham số, rõ ràng:

    @(request: play.api.mvc.RequestHeader, providerId: String, loginForm: Option[play.api.data.Form[(String, String)]] = None) 
    
  5. dòng 20 của mẫu cung cấp dịch vụ cần phải vượt qua các yêu cầu (vì vậy rằng phương thức chính xác được gọi, nếu không bạn sẽ nhận được một số RuntimeException: There is no HTTP Context available from here):

    <form action = "@securesocial.core.providers.utils.RoutesHelper.authenticateByPost("userpass").absoluteURL(IdentityProvider.sslEnabled)(request)" 
    

Đây phải là tất cả thay đổi cần thiết, nếu bạn đang sử dụng các mẫu khác, chúng sẽ phải được điều chỉnh cho phù hợp.

Chỉ cần đề cập đến điều đó: Tôi đã thay đổi mẫu javaPlugin của chúng tôi thành phiên bản scala (để chuyển thẳng về phía trước).

+0

Điều đó gần như đã hiệu quả. Vâng, nó làm việc cho tôi, vì tôi chỉ sử dụng userpass. Lỗi tôi nhận được nằm trên @provider (p.id). Tôi vừa xóa nó và đặt nội dung của provider.scala.html vào login.scala.html. Những người khác sẽ có một vấn đề mặc dù. –

+0

@ChananBraunstein Tôi đã viết điều này: "(các cuộc gọi từ mẫu đăng nhập cần được điều chỉnh cho phù hợp - chuyển yêu cầu làm đối số đầu tiên)" - ngay cả với điều này nó không hoạt động? Tôi sẽ kéo nó vào một điểm đạn riêng biệt để nó có thể nhìn thấy rõ hơn. – MartinGrotzke

+0

@ChananBraunstein Nếu bạn sử dụng provider.scala.html một lần nữa, nó có hoạt động cho bạn với các cuộc gọi được điều chỉnh đến mẫu nhà cung cấp (mục mới 3.) không? – MartinGrotzke

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