2011-02-03 30 views
12

Tôi biết điều này có vẻ là một câu hỏi ngu ngốc nhưng tôi không thể tìm thấy bất kỳ thông tin nào về câu hỏi này. Tôi có một dịch vụ web java (được tạo bằng cách sử dụng NetBeans) và bên trong lớp dịch vụ web tôi muốn biết URL mà tại đó dịch vụ web đã được triển khai. Ví dụ: nếu tôi triển khai dịch vụ web trên máy chủ glassFish địa phương của tôi, dịch vụ web có sẵn tại "http: // localhost: 8080/MyService /" trong đó "MyService" là tên dịch vụ của tôi. Lý do tôi cần biết URL này là do dịch vụ web của tôi tạo một số tệp mà tôi cần cung cấp tại URL này. Ví dụ: cuộc gọi dịch vụ web trả lại URL "http: // localhost: 8080/MyService/report.html" Tôi đã tìm thấy một số liên kết về "WebServiceContext" nhưng tôi không thể nhận URL mà dịch vụ web của tôi là đang chạy.Làm cách nào để tìm URL của dịch vụ web của tôi?

Sửa

Để làm rõ: Bên trong MyWebService.java lớp tôi muốn tìm hiểu các URL mà tại đó dịch vụ web của tôi đã được triển khai (trong trường hợp này, dịch vụ web của tôi đang chạy ở "http: // localhost: 8080/MyService/", nhưng khi nó được triển khai trên một máy chủ sản xuất, URL này sẽ thay đổi)

Trả lời

4

Nếu bạn đang yêu cầu làm thế nào để tìm ra tên máy (ví dụ như 'localhost' hoặc 'www.example.com') mà chứa servlet của bạn đang lắng nghe để bạn có một vài lựa chọn:

  • Thêm một điểm cấu hình được đặt vào thời gian triển khai (ví dụ: tệp cấu hình, thuộc tính hệ thống)
  • Xem xét nếu thùng chứa servlet của bạn hiển thị bất kỳ cấu hình 'máy chủ ảo' nào qua JMX hoặc đọc tệp cấu hình của nó (ví dụ: tomcat hosts)
  • Tìm địa chỉ IP của máy chủ và thực hiện tra cứu DNS để nhận tên máy chủ được định cấu hình
  • .210
  • Kiểm tra tiêu đề 'chủ' của HttpServletRequest đến

    String hostname = request.getRequestHeader("Host");

+0

Tôi hiện đã thiết lập để đọc URL từ tệp cấu hình. Tôi đang cố gắng xóa cài đặt cấu hình này vì tôi nghĩ rằng việc tìm ra URL của máy chủ cũng đủ dễ dàng. – Johnny

+0

Nếu bạn thực sự muốn có cấu hình phía máy chủ, bạn sẽ cần phải sử dụng tiêu đề 'Máy chủ' nằm trong yêu cầu HTTP. –

+0

Uriah, tôi không thể nhận URL đó từ tiêu đề "Máy chủ". Nếu bạn có thể hiển thị mã xin vui lòng cho tôi biết. cảm ơn. – Johnny

2

Hy vọng tôi có thể giúp bạn, tôi vừa mới bắt đầu làm việc với webservices (Jersey REST) ​​và tôi thấy rằng url đến điểm cuối của bạn là: 'http: // localhost: 8080/MyService/XXX/YYY'
trong đó XXX = mẫu URL trong ánh xạ servlet trong tệp web.xml của bạn (ví dụ: tệp thấp)

<servlet-mapping> 
<servlet-name>Jersey REST Service</servlet-name> 
<url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

và YYY là con đường xác định bởi tham số @Path của webservice của bạn() để trong trường hợp ví dụ này nó sẽ là một cái gì đó như:

'http: // localhost: 8080/MyService/rest/myPathDefinition '

Một điều cần lưu ý khác là bạn có thể thay đổi gốc ngữ cảnh web trong nhật thực, mặc dù nó sẽ mặc định tên của dự án Java của bạn. Vui lòng cho tôi biết nếu bạn cần làm rõ thêm hoặc nếu điều này không giúp/ai đó có thể mở rộng trên đó.

+0

Tôi không nghĩ mình đã làm cho mình đủ rõ ràng, vì vậy tôi sẽ cố gắng cải tổ câu hỏi. Tôi biết URL của dịch vụ web của tôi vì tôi đang triển khai nó. Câu hỏi đặt ra là, làm thế nào để tôi lập trình nhận được URL đó. Vì vậy, bên trong lớp MyWebservice.java, tôi muốn biết URL mà dịch vụ web của tôi đã được triển khai (trong trường hợp này là "http: // localhost: 8080/MyService", nhưng điều này sẽ thay đổi khi dịch vụ web được triển khai trên một máy chủ sản xuất). – Johnny

8

dễ dàng hơn trong quan điểm của tôi, ví dụ:

@GET 
public URI redirectSendMail(@Context UriInfo ui) { 
    return ui.getBaseUri(); 
} 

Nếu chúng tôi muốn gửi một String trở lại khách hàng, cho thấy đường dẫn chính xác của một số tài nguyên, chúng tôi có thể muốn một cái gì đó như thế này.

@GET 
public String getResourcePath(@Context UriInfo ui) { 
    return ui.getAbsolutePath(); 
} 
1

Thêm thuộc tính bên dưới vào lớp webservice của bạn.

@Resource  
private WebServiceContext wsCtxt; 

Bây giờ bên dưới đoạn mã sẽ cung cấp cho bạn các giá trị bạn đang tìm kiếm:

MessageContext msgCtxt = wsCtxt.getMessageContext(); 
    HttpServletRequest request = 
     (HttpServletRequest)msgCtxt.get(MessageContext.SERVLET_REQUEST); 

    String hostName = request .getServerName(); 
    int port = request .getServerPort(); 

để kiểm tra từ nơi webservice được gọi, sử dụng mã dưới đây.

String clientIP = request .getRemoteAddr(); 

nhập khẩu có liên quan là dưới đây:

import javax.annotation.Resource; 

import javax.servlet.http.HttpServletRequest; 

import javax.xml.ws.WebServiceContext; 
import javax.xml.ws.handler.MessageContext; 

import weblogic.jws.Context; 

import weblogic.wsee.jws.JwsContext; 
+0

Có vẻ như @Resource sẽ trả về null dưới một số trường hợp nhất định ... Xem tại đây: https://stackoverflow.com/questions/15346630/jax-ws-webservicecontext-remains-null-annotation-injection-fails – JGFMK

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