Difference between #Path and #Webmethod - web-services

Can some one tell me the where should be #WebMethod used and where #Path or #RequestMapping should be used?
Recently I came through a code where #webmethod is used, till now I have been using #path and #requestmapping for implementing my webservices.
Well, the code with Webmethod was using SOAP webservices.
Is it something to do with SOAP or REST? or Java or J2EE?
I have tried googling, but no success till now.
#WebMethod(operationName = "GetPendingrequest")
public abstract ERxPendingRequestsCounts getERxPendingCountsForProvider(#WebParam(name = "pvid") BigDecimal pvid)
throws SystemFault,SecurityFault, IllegalArgumentFault;

#Path is a JAX-RS notation. #WebMethod is the standard JAX-WS notation that tells that this particular method should be exposed as a public operation of the WebService.
Note:
JAX-RS is specification that deals with RESTful interfaces while JAX-WS is the corresponding one for SOAP.
You can find more details on standard JAX-WS annotations here: https://docs.oracle.com/cd/E13222_01/wls/docs92/webserv/annotations.html#wp1040606

Related

How to implement REST web-services?

I am trying to learn Java Web-Service using REST architecture.
So far I have created a class but I don't know how to consume that service.
Here's my code:
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
#Path("/SericeCreation")
public class SericeCreation {
#GET
#Produces("text/plain")
public String display(){
return "hello";
}
}
Now, I want to call this display method.
Can anyone help me to understand how this can be achieved?
In a very simplified point of view, rest services are bound to Http calls, in your example the #GET annotation tells you that this method is accessed by making an HTTP GET call.
You can simply point your browser to the url generated for this service and you should see the "hello" response. The url is something like this http://<server>:<port>/<AppContext>/<rest-servlet-mapping>/SericeCreation where:
<server> is your server name. Typically localhost
<port> the default server port number. If you are usin Jboss 8080
<AppContext> typically the name of your applicaction (War file)
<rest-servlet-mapping> the RestEasy or Jersey frameworks servlet path
/SericeCreation this comes from the #Path annotation that is used
in your class.
Another way to intereact with your services is using a Rest Client like this one.
And of course, if you want to create a java client you can use the apache http client library, java.net.* package or others. Remember, rest services are accessed by making http calls.
I recommend you read this two tutorials to get a general idea of rest architecture.
Rest RefCard
Beginner's Guide
This great tutorial shows you a lot of examples using Jersey or RestEasy in order to implement Java Rest Services.

JAX-WS Web Service, how it works

I'm read official oracle tutorial, but dont understand this full. I'm glad if we answer my questions.
Question 1. What's conceptual difference between JAX-WS Web Service and RMI? Both RMI and JAX-WS can invoke remote method.
Question 2. Why we cant use servlets only for the features, that can be implemented by JAX-WS? Just declare init servlet's methods.
Question 3. As i understand, web service JAX-WS can't get http response and http request whithout servlets, for example. It's just set of endpoints classes, whose contains WebMethods with their implementation. I.e. if we want to communicated with service through web-client we must declare appropriate servlet for this needs. This servlet will parse http request, invoke appropriate #WebMethod generate and sent http response. Is it correct?
Question 4. Is WSDL document just xml-file whose contain description availabl #WebMethod by this WEbService and all?
Question 5. From the official tutorial:
A client creates a proxy (a local object representing the service) and then simply invokes methods on the proxy.
Does client create a proxy based on service's WSDL-document?
My take on the answers in order:
RMI invokes methods of remote Java objects directly from objects in other Java virtual machines and uses object serialization to marshal and unmarshal parameters. Notice how all of this is Java-specific. JAX-WS is about a Java API for leveraging standards (SOAP, WSDL, etc) to facilitate broader interoperability instead. As a result, applications of all kinds can talk to each other--not just Java to Java.
With JAX-WS, you are using servlets. It's just that the specification provides an abstraction on top of the Servlet API. It is always better to work with abstractions than with low-level implementation details. This frees you up to work on the interesting stuff and helps you avoid mistakes.
I don't quite follow this question, but HttpServlet is the Java EE abstraction for all HTTP communication. So JAX-WS, JAX-RS, and other specifications rely on HttpServlet. You don't have to specify the servlets or anything. That's one of the many low-level details the abstractions free you from.
WSDL is a standard that transcends platform or implementation. In other words, it has no idea about #WebMethod or any other implementation-specific details. It just defines the interface for interacting with the service.
Yes. WSDL's aren't meant to be consumed by humans. They define the interface for interacting with the service, and clients (Java, .NET, whatever) use these to auto-generate stubs for you to use to call the services defined in the WSDL. The client generates the SOAP request for you and processes the SOAP response for you.

Access EJB 3.0 as an EJB and as a web service on Websphere 7

I want to deploy an EJB 3.0 stateless bean to WAS7 so I can access it as an EJB through a local interface and also as a jax-ws web service.
My bean looks as following:
#Stateless
#WebService
public class UserManagerImpl implements UserManager {
public UserManagerImpl() {
}
#WebMethod
public String getName(){
return "UserName";
}
}
The problem is that if I package it into an EJB-JAR and deploy, it doesn't work as a web service on WAS-7.
The only working configuration for me is if I put the EJB-JAR into a EAR and put this EJB-JAR to a WAR that is also in the EAR, like this:
EAR/
|--EJB-JAR
|--WAR/
|WEB-INF/lib/
|EJB-JAR
So my bean is duplicated.
Is there any problem with this design? If so, is there a better solution?
If your application contains #WebService annotated EJBs, then you need to process the EAR with the endptEnabler tool shipped with WebSphere before deploying it. Note that this doesn't apply to #WebService annotated classes in Web modules.

Is it possible to define a servlet filter for a stateless ejb webservice, on GlassFish 3.1

I want to export a Web-Service which was implemented as a stateless EJB. I know that these WebServices were hanled by the EJB Container, when they are annotated as #Stateless + #Webservice. Is it possible to route all incoming requests to this Webservice through a Servlet-Filter.
The Servlet-Filter works when my Java-Class is annotated #Stateful and #Webservice, or just #Webservice. But not in conjunction with #Stateless. Anyway to register a Servlet Filter for an EJB Webservice?
Many thanks!
Adem
UPDATE:
Solved this problem, by annotating WebService Class with
#WebService
#RequestScoped
Filter works only in this constellation and acting as Stateless class for WebService consumer.
Lifecycle Callbacks : You can have a method with #PostConstruct annotation which gets called after the container has initialized the bean.
Interceptor : You can have a interceptor class which gets invoked when applied at bean class/method level by annotation #Interceptors(ProcessMonitor.class).
Note : I haven't tried it in conjunction with #Webservice.

Java EE 6 WebService and CDI injection

This is a clarification question I've got from a Java EE 5 migration. I'm currently developing a Java EE 6 web service packed in a WAR file, and I would like to know if it's possible to use CDI on it. I've seen some examples using the #Stateless annotation, which it's not possible to do in a WAR (as far as I know).
Current implementation:
#WebService
public class MyService{
#Inject
HelloTeller teller:
#WebMethod
public String sayHello(){
teller.sayHello();
}
}
Note: The other approach would be to create an ejbModule specifically for this web-service.
In EE6, you should be able to use a SLSB as JAX-WS endpoint in a war. You can inject EJBs, request scoped and application scoped beans from CDI.