2013-01-08 28 views
9

Tôi đang phát triển một ứng dụng Android để kết nối với Tridion 2011 SP1 Core Service. Cho đến nay tôi đã tạo Android WS Stubs từ wsdl dịch vụ cốt lõi bằng wsclient.Không thể kết nối với Dịch vụ cốt lõi Tridion từ máy khách Android

Nhập các sơ khai đó, cho phép truy cập vào tất cả các phương pháp dịch vụ cốt lõi.

bây giờ tôi có thể xác thực để Tridion qua ứng dụng Android nhưng ngay sau khi tôi cố gắng thực hiện ngay cả những cơ bản nhất của cuộc gọi dịch vụ web, chẳng hạn như getApiVersion(), tôi nhận được lỗi:

ReflectionHelper*java.lang.NoSuchFieldException: GetApiVersionResult.

tôi đã tự hỏi có ai khác quản lý để tạo ra một ứng dụng Android java giao tiếp với Dịch vụ cốt lõi không?

Điều thú vị là đủ, nếu tôi chạy mã dưới dạng ứng dụng java, việc sử dụng wsimport sẽ làm mọi thứ hoạt động tốt.

Bất kỳ trợ giúp đánh giá cao. Để tham khảo ở đây là một đoạn mã:

Để kết nối với Tridion:

class TridionConnect extends AsyncTask<String, Integer, String> { 
    // Called to initiate the background activity 

    @Override 
    protected String doInBackground(String... statuses) { 
    try { 
     Authenticator.setDefault(new Authenticator() { 
     @Override 
     protected PasswordAuthentication getPasswordAuthentication() { 
      return new PasswordAuthentication("username", "password".toCharArray()); 
     } 
     }); 

     url = new URL("http://tridion-server/webservices/CoreService2011.svc?wsdl"); 

     System.out.println(String.format("Get Service")); 
     service = new CoreService2011(); 
     System.out.println(String.format("Get Client")); 

     client = service.getBasicHttp(); 

     return "Authenticated To Tridion"; 
    } catch (Exception e) { 
     Log.e("Authentication failure", e.toString()); 
     e.printStackTrace(); 
     return "Failed to authenticate"; 
    } 
    } 

    // Called when there's a status to be updated 
    @Override 
    protected void onProgressUpdate(Integer... values) { 
    super.onProgressUpdate(values); 
    // Not used in this case 
    } 

    // Called once the background activity has completed 
    @Override 
    protected void onPostExecute(String result) { // 
    Toast.makeText(FullscreenActivity.this, result, Toast.LENGTH_LONG).show(); 
    area.setText("Authenticated to Tridion OK"); 
    } 
} 

Để có được ApiVersion

client.getApiVersion(); 
UserData currentUser = client.getCurrentUser(); 
System.out.println(String.format("'%s' %s", currentUser.getTitle(), currentUser.getId())); 
+1

Xin chào Allan, nói chung tốt nhất là chuyển toàn bộ ngoại lệ sang 'Log.e' và không chỉ là 'toString':' Log.e ("TridionConnect", "Authentication Failure", e); ' –

+0

I chỉ thấy rằng bạn đã nói mã hoạt động tốt trong một chương trình thông thường. Trong trường hợp đó, nó có thể là một sự khác biệt giữa JVM/JRE thực và Dalvik. Nhưng mà không tái tạo vấn đề của bạn, tôi không thể chắc chắn. –

+0

Tôi đang đi đến kết luận rằng điều này là không thể như mô tả ở trên. Tôi có một giải pháp thay thế mà tôi hiện đang điều tra. –

Trả lời

1

Frank,

Nó không phải là có thể cho một vài lý do .

Nếu bạn sử dụng wsimport để tạo proxy coreservice, nó sẽ sử dụng thư viện javax, tồn tại trong JRE. Tuy nhiên Dalvik chỉ thực hiện một tập hợp con của thư viện javax có nghĩa là phương pháp này là không thể trong môi trường Android.

Sau đó tôi đã xem các công cụ Ksoap2 để tạo proxy. Điều này dường như làm việc OK, trong nhiều như nó đã tạo ra một proxy, tuy nhiên nó không phù hợp với coreservice vì vậy tôi đã không thể xác thực. Tôi đã không nhận được bất kỳ tiếp tục với phương pháp này ngoài kiểm tra proxy JRE v Ksoap2 proxy. Chúng khá khác nhau.

Tại thời điểm này, tôi lùi lại một bước, có một tách trà và tái thiết kế phương pháp tiếp cận.

Tôi đã tạo dịch vụ C# REST để ngồi giữa ứng dụng android và dịch vụ cốt lõi.

Cách tiếp cận này có vẻ hơi phức tạp nhưng mang lại nhiều lợi thế. Rất nhiều công việc thuổng có thể được thực hiện trong dịch vụ REST, sẽ nhanh hơn nhiều so với mã tương tự trên máy tính bảng hoặc điện thoại. Thứ hai, dịch vụ REST nằm trên cùng một máy chủ với CMS/CoreService để các dấu phẩy nhanh hơn và bạn có thể thực hiện các yêu cầu REST từ ứng dụng Android nhẹ hơn nhiều.

Tôi đã nhận được ứng dụng đến điểm mà bạn có thể xác thực thành Tridion, chọn một ấn phẩm và các thành phần sau đó được hiển thị trong bố cục động sẵn sàng để cập nhật/lưu/xuất bản.

Một nhược điểm lớn của phương pháp này là dịch vụ REST 'nên' là không trạng thái quá hời hợt, bạn phải xác thực với dịch vụ lõi cho mọi yêu cầu. Tất nhiên tôi không làm điều đó, nhưng bạn phải đưa ra một số cách tiếp cận thay thế Oauth, chia sẻ bí mật, v.v.

Trong thử nghiệm ban đầu, phương pháp này dường như khá trơn tru trên thiết bị Android.

+1

Xin chào Bart, tôi đã cam kết đề xuất 51 khu vực. Tôi bắt đầu phát triển Tridion khi chúng tôi ở phiên bản 5.1 và tài nguyên duy nhất là diễn đàn tridion và bộ phận hỗ trợ. Đó là thời gian cao, chúng tôi đã có một nguồn tài nguyên công khai cho tất cả mọi thứ Tridion. –

+0

Cả hai bình luận ở trên từ Josanne Kane, thực tế là từ tôi .... Vợ tôi rõ ràng đã sử dụng máy tính xách tay của tôi. Là một sang một bên, không có bất kỳ lời khuyên của cô, trừ khi nó liên quan đến nướng! –

+0

Bạn nên đánh dấu đây là câu trả lời, nó sẽ giúp người khác tìm đường ... –

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