যখন আমি সিএনএক্সএফ থেকে ডাব্লুএসডিএল 2 জাভা ব্যবহার করে একটি ওয়েব সার্ভিস ক্লায়েন্ট জেনারেট করি (যা ডাব্লুএসপোর্টের অনুরূপ কিছু উত্পন্ন করে), আমার পরিষেবাগুলি কোডগুলি দিয়ে শুরু হয়:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "c:/some_absolute_path_to_a_wsdl_file.wsdl",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("c:/some_absolute_path_to_a_wsdl_file.wsdl");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from c:/some_absolute_path_to_a_wsdl_file.wsdl");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
হার্ডকোডযুক্ত পরম পথটি সত্যই সফল হয়। উত্পন্ন শ্রেণি খনি ছাড়া অন্য কোনও কম্পিউটারে কাজ করবে না।
প্রথম ধারণাটি হ'ল ডাব্লুএসডিএল ফাইল (প্লাস এটি আমদানি করা সমস্ত কিছুই, অন্যান্য ডাব্লুএসডিএল এবং এক্সএসডি) কোথাও একটি জার-ফাইলের মধ্যে রেখে এবং এটি শ্রেণিবদ্ধ করে। তবে আমরা এড়াতে চাই। যেহেতু সমস্ত জিনিস ডাব্লুএসডিএল এবং এক্সএসডি-ভিত্তিক স্যাক্সএফ এবং জ্যাকএক্সবি দ্বারা উত্পাদিত হয়েছিল, তাই রানটাইমের সময় আমরা ডাব্লুএসডিএলকে জানার দরকার নেই point
ডাব্লুএসডিএলএলএকশন অ্যাট্রিবিউটটি ডাব্লুএসডিএল লোকেশনকে ওভাররাইড করার উদ্দেশ্যে তৈরি করা হয়েছে (কমপক্ষে এটি আমি কোথাও পড়েছি), এবং এটির ডিফল্ট মান ""। যেহেতু আমরা <wsdlLocation></wsdlLocation>
maven ব্যবহার করছি, আমরা উত্স জেনারেটরকে ডাব্লুএসডিএল লোকেশন ফাঁকা ছেড়ে দিতে বাধ্য করার জন্য সিক্সএফের কনফিগারেশনের অভ্যন্তরে অন্তর্ভুক্ত করার চেষ্টা করেছি। তবে এটি খালি থাকার কারণে এটি কেবল এক্সএমএল ট্যাগকে উপেক্ষা করে। আমরা একটি সত্যই কুরুশ লজ্জাজনক হ্যাক করেছি, ব্যবহার করে <wsdlLocation>" + "</wsdlLocation>
।
এটি অন্যান্য স্থানগুলিতেও পরিবর্তন করে:
@WebServiceClient(name = "StatusManagement",
wsdlLocation = "" + "",
targetNamespace = "http://tempuri.org/")
public class StatusManagement extends Service {
public final static URL WSDL_LOCATION;
public final static QName SERVICE = new QName("http://tempuri.org/", "StatusManagement");
public final static QName WSHttpBindingIStatus = new QName("http://tempuri.org/", "WSHttpBinding_IStatus");
static {
URL url = null;
try {
url = new URL("" + "");
} catch (MalformedURLException e) {
System.err.println("Can not initialize the default wsdl from " + "");
// e.printStackTrace();
}
WSDL_LOCATION = url;
}
সুতরাং, আমার প্রশ্নগুলি হ'ল:
সমস্ত ক্লাস সিক্সএফ এবং জ্যাকএক্সবি দ্বারা তৈরি করা হলেও আমাদের কি সত্যই কোনও ডাব্লুএসডিএল অবস্থানের প্রয়োজন? যদি হ্যাঁ, কেন?
আমাদের যদি সত্যই ডাব্লুএসডিএল অবস্থানের প্রয়োজন না হয়, তবে সিএক্সএফ এটি তৈরি না করে এবং এটিকে পুরোপুরি এড়িয়ে চলার জন্য সঠিক ও পরিষ্কার উপায় কী?
আমরা সেই হ্যাকের সাথে কী খারাপ প্রতিক্রিয়া পেতে পারি? কী হয় তা দেখার জন্য আমরা এখনও এটি পরীক্ষা করতে পারি না, তাই যদি কেউ আগে থেকে বলতে পারে, তবে ভাল লাগবে।
classpath:
মধ্যে<wsdlLocation...
লাইন।