Oracle® Fusion Middleware: Developing and Securing Restful Web Services For Oracle Weblogic Server 12C (12.2.1)
Oracle® Fusion Middleware: Developing and Securing Restful Web Services For Oracle Weblogic Server 12C (12.2.1)
Oracle® Fusion Middleware: Developing and Securing Restful Web Services For Oracle Weblogic Server 12C (12.2.1)
Oracle
Fusion Middleware
October 2015
Documentation for software developers that describes how
to develop Java EE web services that conform to the
Representational State Transfer (REST) architectural style
using Java API for RESTful Web Services (JAX-RS).
Oracle Fusion Middleware Developing and Securing RESTful Web Services for Oracle WebLogic Server, 12c
(12.2.1)
E55163-01
Copyright 2013, 2015 Oracle and/or its affiliates. All rights reserved.
This software and related documentation are provided under a license agreement containing restrictions on
use and disclosure and are protected by intellectual property laws. Except as expressly permitted in your
license agreement or allowed by law, you may not use, copy, reproduce, translate, broadcast, modify, license,
transmit, distribute, exhibit, perform, publish, or display any part, in any form, or by any means. Reverse
engineering, disassembly, or decompilation of this software, unless required by law for interoperability, is
prohibited.
The information contained herein is subject to change without notice and is not warranted to be error-free. If
you find any errors, please report them to us in writing.
If this is software or related documentation that is delivered to the U.S. Government or anyone licensing it
on behalf of the U.S. Government, then the following notice is applicable:
U.S. GOVERNMENT END USERS: Oracle programs, including any operating system, integrated software,
any programs installed on the hardware, and/or documentation, delivered to U.S. Government end users
are "commercial computer software" pursuant to the applicable Federal Acquisition Regulation and
agency-specific supplemental regulations. As such, use, duplication, disclosure, modification, and
adaptation of the programs, including any operating system, integrated software, any programs installed on
the hardware, and/or documentation, shall be subject to license terms and license restrictions applicable to
the programs. No other rights are granted to the U.S. Government.
This software or hardware is developed for general use in a variety of information management
applications. It is not developed or intended for use in any inherently dangerous applications, including
applications that may create a risk of personal injury. If you use this software or hardware in dangerous
applications, then you shall be responsible to take all appropriate fail-safe, backup, redundancy, and other
measures to ensure its safe use. Oracle Corporation and its affiliates disclaim any liability for any damages
caused by use of this software or hardware in dangerous applications.
Oracle and Java are registered trademarks of Oracle and/or its affiliates. Other names may be trademarks of
their respective owners.
Intel and Intel Xeon are trademarks or registered trademarks of Intel Corporation. All SPARC trademarks
are used under license and are trademarks or registered trademarks of SPARC International, Inc. AMD,
Opteron, the AMD logo, and the AMD Opteron logo are trademarks or registered trademarks of Advanced
Micro Devices. UNIX is a registered trademark of The Open Group.
This software or hardware and documentation may provide access to or information about content,
products, and services from third parties. Oracle Corporation and its affiliates are not responsible for and
expressly disclaim all warranties of any kind with respect to third-party content, products, and services
unless otherwise set forth in an applicable agreement between you and Oracle. Oracle Corporation and its
affiliates will not be responsible for any loss, costs, or damages incurred due to your access to or use of
third-party content, products, or services, except as set forth in an applicable agreement between you and
Oracle.
Contents
Preface ................................................................................................................................................................ vii
Documentation Accessibility ....................................................................................................................
Conventions ................................................................................................................................................
vii
vii
ix
x
x
1-1
1-2
1-2
1-3
1-4
2.5.3
2.6
2.6.1
2.6.2
2.6.3
2.6.4
2.7
2.8
2.9
2.10
2.11
2.12
2.13
What Happens At Runtime: How the Resource Method Is Selected for Response
Messages 2-12
Extracting Information From the Request Message............................................................
How to Extract Variable Information from the Request URI (@PathParam)...........
How to Extract Request Parameters (@QueryParam) .................................................
How to Define the DefaultValue (@DefaultValue)......................................................
Enabling the Encoding Parameter Values (@Encoded) ..............................................
Building Custom Response Messages ..................................................................................
Mapping HTTP Request and Response Entity Bodies Using Entity Providers..............
Accessing the Application Context .......................................................................................
Building URIs ...........................................................................................................................
Using Conditional GETs .........................................................................................................
Accessing the WADL...............................................................................................................
More Advanced RESTful Web Service Tasks ......................................................................
2-12
2-13
2-13
2-14
2-15
2-15
2-18
2-19
2-20
2-21
2-22
2-22
4-1
4-1
4-2
4-3
4-3
4-5
4-7
4-7
5-1
5-1
5-2
5-3
5-4
iv
7.2
7.3
7.4
7.5
7.6
7.6.1
7.6.2
7.6.3
7.7
Monitoring RESTful Web Services Using Enterprise Manager Fusion Middleware Control .
7-2
Monitoring RESTful Web Services Using the Administration Console ............................. 7-2
Monitoring RESTful Web Services Using WLST.................................................................... 7-3
Enabling the Tracing Feature .................................................................................................... 7-6
Disabling RESTful Web Service Application Monitoring..................................................... 7-6
Disabling Monitoring for a RESTful Web Service Application Using Jersey Property.....
7-7
Disabling Monitoring for a RESTful Web Service Application Using WebLogic
Configuration MBean 7-9
Disabling RESTful Web Service Application Monitoring for a WebLogic Domain .. 7-9
Enable Monitoring of Synthetic Jersey Resources in a RESTful Web Service Application......
7-10
A-1
A-2
A-3
A-4
A-5
A-5
A-6
A-7
A-8
A-8
A-8
A-9
A-9
A-9
A-10
A-10
vi
Preface
This preface describes the document accessibility features and conventions used in this
guideDeveloping and Securing RESTful Web Services for Oracle WebLogic Server.
Documentation Accessibility
For information about Oracle's commitment to accessibility, visit the Oracle
Accessibility Program website at
http://www.oracle.com/pls/topic/lookup?ctx=acc&id=docacc.
Access to Oracle Support
Oracle customers that have purchased support have access to electronic support
through My Oracle Support. For information, visit
http://www.oracle.com/pls/topic/lookup?ctx=acc&id=info or visit
http://www.oracle.com/pls/topic/lookup?ctx=acc&id=trs if you are hearing
impaired.
Conventions
The following text conventions are used in this document:
Convention
Meaning
boldface
italic
monospace
vii
viii
Provides support for Jersey 2.x (JAX-RS 2.0 RI) by default in this release.
Registration as a shared library with WebLogic Server is no longer required.
Provides enhanced monitoring of RESTful web services in the WebLogic
Administration Console, including enhanced runtime statistics for your RESTful
applications and resources, detailed deployment and configuration data, global
execution statistics, and resource and resource method execution statistics. For
more information, see Chapter 7, "Monitoring RESTful Web Services and Clients."
Includes the ability to disable RESTful web services monitoring at the individual
application level, or globally at the domain level. For more information, see
"Disabling RESTful Web Service Application Monitoring" on page 7-6.
Reflects support for the Jersey 2.21.1 JAX-RS 2.0 RI.
Supports securing Jersey 2.x (JAX-RS 2.0 RI) web services using Oracle Web
Services Manager (OWSM) security policies. For more information, see "Securing
RESTful Web Services and Clients Using OWSM Policies" on page 5-1.
Adds support for Java EE 7.
The Jersey 1.x client API is deprecated. It is recommended that you update your
RESTful client applications to use the JAX-RS 2.0 client APIs at your earliest
convenience.
Removes support for the Jersey 1.x (JAX-RS 1.1. RI) server APIs. You should use
the corresponding standard JAX-RS 2.0 or Jersey 2.x APIs instead.
Note: Support for the Jersey 1.18 (JAX-RS 1.1RI) client APIs are
deprecated in this release of WebLogic Server but are maintained for
backward compatibility. For more information, see "Develop RESTful
Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)" on page A-1.
ix
Reflects support of the Jersey 2.5.1 Java API for RESTful Web Services (JAX-RS) 2.0
Reference Implementation (RI) as a pre-built shared library.
Reflects support for the Jersey 1.18 JAX-RS 1.1. RI.
Secure RESTful web services using Oracle Web Services Manager (OWSM)
policies. For more information, see "Securing RESTful Web Services and Clients
Using OWSM Policies" on page 5-1.
New standalone web service client JAR files that support basic RESTful web
service client-side functionality and Oracle Web Services Manager (OWSM)
security policy support. See "Invoking a RESTful Web Service from a Standalone
Client" on page 3-2.
1
Introduction to RESTful Web Services
1
This chapter provides an overview of developing Java EE web services that conform to
the Representational State Transfer (REST) architectural style using Java API for
RESTful Web Services (JAX-RS).
[2]
For definitions of unfamiliar terms found in this and other books, see the Glossary.
1-1
Table 11
Constraint
Description
Addressability
Identifies all resources using a uniform resource identifier (URI). In the English
language, URIs would be the equivalent of a noun.
Uniform interface
Enables the access of a resource using a uniform interface, such as HTTP methods
(GET, POST, PUT, and DELETE). Applying the English language analogy, these
methods would be considered verbs, describing the actions that are applicable to the
named resource.
Client-server architecture
Separates clients and servers into interface requirements and data storage
requirements. This architecture improves portability of the user interface across
multiple platforms and scalability by simplifying server components.
Stateless interaction
ScalabilityNot having to store state enables the server to free resources quickly.
Cacheable
Layered system
Enables client to connect to an intermediary server rather than directly to the end
server (without the client's knowledge). Use of intermediary servers improve system
scalability by offering load balancing and shared caching.
Jersey 2.21.1
1-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
The Jersey 1.x server-side APIs are no longer supported. You should
use the corresponding standard JAX-RS 2.0 or Jersey 2.x APIs instead.
The Jersey 1.x client API is deprecated. It is recommended that you
update your RESTful client applications to use the JAX-RS 2.0 client
APIs at your earliest convenience.
The Jersey 2.x (JAX-RS 2.0 RI) includes the following functionality:
Jersey
JAX-RS API
Table 12 lists key features delivered with Jersey 2.x (JAX-RS 2.0 RI).
Table 12
Key Feature
Description
Client API
Communicate with RESTful web services in a standard way. The Client API facilitates
the consumption of a web service exposed via HTTP protocol and enables developers
to concisely and efficiently implement portable client-side solutions that leverage
existing and well established client-side HTTP connector implementations.
For complete details, see:
Asynchronous
communication
"Accessing REST Resources with the JAX-RS Client API" in Java EE 7 Tutorial
Using filters, modify inbound and outbound requests and responses., such as header
information. Using interceptors, modify entity input and output streams. Filters and
interceptors can be used on both the client and server side.
For complete details, see "Filters and Interceptors" in the Jersey 2.21 User Guide.
For more information about JAX-RS and samples, see Section 1.5, "Learn More About
RESTful Web Services."
1-3
Table 13
Task
More Information
Resource
Link
https://jersey.java.net/
https://jcp.org/en/jsr/detail?id=339
https://jax-rs-spec.java.net/nonav/2.0-rev-a/apidocs/index.html
JAX-RS Project
https://jax-rs-spec.java.net/
The Java EE 7
TutorialBuilding
RESTful Web Services
With JAX-RS
http://docs.oracle.com/javaee/7/tutorial/jaxrs.htm
"Representational State
Transfer (REST)" in
Architectural Styles and the
Design of Network-based
Software Architectures
(Dissertation by Roy
Fielding)
http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm
1-4 Developing and Securing RESTful Web Services for Oracle WebLogic Server
2
Developing RESTful Web Services
2
This chapter describes how to develop Java EE web services that conform to the
Representational State Transfer (REST) architectural style using Java API for RESTful
Web Services (JAX-RS).
[3]
Mapping HTTP Request and Response Entity Bodies Using Entity Providers
Building URIs
For information about developing RESTful web services using Oracle JDeveloper, see
"Creating RESTful Web Services and Clients" in Developing Applications with Oracle
JDeveloper.
Table 21
Task
More Information
2-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Additional examples are listed in Section 1.5, "Learn More About RESTful Web
Services."
Example 21
package samples.helloworld;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
// Specifies the path to the RESTful service
@Path("/helloworld")
public class helloWorld {
// Specifies that the method processes HTTP GET requests
@GET
@Produces("text/plain")
public String sayHello() {
return "Hello World!";
}
}
Is annotated with @Path. For more information, see Section 2.3, "Defining the
Relative URI of the Root Resource and Subresources."
Has at least one method annotated with @Path or with a request method designator,
such as @GET, @POST, @PUT, or @DELETE. A resource method is a method in the
resource class that is annotated using a request method designator. For more
information, see Section 2.4, "Mapping Incoming HTTP Requests to Java
Methods."
2.3 Defining the Relative URI of the Root Resource and Subresources
Add the javax.ws.rs.Path annotation at the class level of the resource to define the
relative URI of the RESTful web service. Such classes are referred to a root resource
classes. You can add @Path on methods of the root resource class as well, to define
subresources to group specific functionality.
The following sections describe how to define the relative URI of the root resource and
subresources:
Section 2.3.1, "How to Define the Relative URI of the Resource Class (@Path)"
Section 2.3.3, "What Happens at Runtime: How the Base URI is Constructed"
2.3.1 How to Define the Relative URI of the Resource Class (@Path)
The @Path annotation defines the relative URI path for the resource, and can be
defined as a constant or variable value (referred to as "URI path template"). You can
add the @Path annotation at the class or method level.
To define the URI as a constant value, pass a constant value to the @Path annotation.
Preceding and ending slashes (/) are optional.
In Example 22, the relative URI for the resource class is defined as the constant value,
/helloworld.
Example 22
package samples.helloworld;
import javax.ws.rs.Path;
...
// Specifies the path to the RESTful service
@Path("/helloworld")
public class helloWorld {. . .}
To define the URI as a URI path template, pass one or more variable values enclosed in
braces in the @Path annotation. Then, you can use the javax.ws.rs.PathParam
annotation to extract variable information from the request URI, defined by the @Path
annotation, and initialize the value of the method parameter, as described in
Section 2.6.1, "How to Extract Variable Information from the Request URI
(@PathParam)."
In Example 23, the relative URI for the resource class is defined using a variable,
enclosed in braces, for example, /users/{username}.
Example 23
package samples.helloworld;
import javax.ws.rs.Path;
...
// Specifies the path to the RESTful service
@Path("/users/{username}")
public class helloWorld {. . .}
}
To further customize the variable, you can override the default regular expression of
"[^/]+?" by specifying the expected regular expression as part of the variable
definition. For example:
@Path("users/{username: [a-zA-Z][a-zA-Z_0-9]}")
In this example, the username variable will match only user names that begin with one
uppercase or lowercase letter followed by zero or more alphanumeric characters or the
2-4 Developing and Securing RESTful Web Services for Oracle WebLogic Server
underscore character. If the username does not match the requirements, a 404 (Not
Found) response will be sent to the client.
For more information, see the @Path annotation in the Java EE 7 Specification APIs.
Defining a Subresource
package samples.helloworld;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
// Specifies the path to the RESTful service
@Path("/users")
public class UserResource {
. . .
@GET
@Path("/list")
public String getUserList() {
...
}
}
myHostNameDNS name mapped to the Web Server. You can replace this with
host:port which specifies the name of the machine running WebLogic Server and
the port used to listen for requests.
contextPathName of the standalone Web application. The Web application
name is specified in the META-INF/application.xml deployment descriptor in an
EAR file or the weblogic.xml deployment descriptor in a WAR file. If not
specified, it defaults to the name of the WAR file minus the .war extension. For
more information, see "context-root" in Developing Web Applications, Servlets, and
JSPs for Oracle WebLogic Server.
servletURIBase URI for the servlet context path. This path is configured as part
of the packaging options defined in Table 41. Specifically, you can define the
servlet context path by:
If the servlet context path is configured using both options above, then the servlet
mapping takes precedence. If you do not configure the servlet context path in your
configuration using either of the options specified above, the WebLogic Server
provides a default RESTful web service application context path, resources. For
more information, see Chapter 4, "Building, Packaging, and Deploying RESTful
Web Service Applications."
In Example 22, at runtime, if the context path for the WAR file is defined as rest and
the default URI for the servlet (resources) is in effect, the base URI to access the
resource is http://myServer:7001/rest/resources/helloworld.
In Example 23, at runtime, the base URI will be constructed based on the value
specified for the variable. For example, if the user entered johnsmith as the username,
the base URI to access the resource is
http://myServer:7001/rest/resources/users/johnsmith.
Annotation
Description
Idempotent
@GET
Yes
@PUT
Yes
@DELETE
Yes
@POST
@HEAD
Returns the response headers only, and not the actual resource (that is, no
message body). This is useful to save bandwidth to check characteristics of a
resource without actually downloading it. For more information, see the
@HEAD annotation in the Java EE 7 Specification APIs.
Yes
Yes
2-6 Developing and Securing RESTful Web Services for Oracle WebLogic Server
N/A
The following sections provide more information about the JAX-RS annotations used
for mapping HTTP requests to Java methods.
Resource Class
URI Path
UsersResource
/users
GET
UserResource
/users/{userid}
BookmarksResource
/users/{userid}/bookmarks
GET, POST
BookmarkResource
/users/{userid}/bookmarks/{bmid}
The bookmark sample, and other Jersey samples, can be accessed in one of the
following ways:
Example 25
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
...
public class BookmarksResource {
...
@Path("{bmid: .+}")
public BookmarkResource getBookmark(@PathParam("bmid") String bmid) {
return new BookmarkResource(uriInfo, em,
userResource.getUserEntity(), bmid);
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public JSONArray getBookmarksAsJsonArray() {
JSONArray uriArray = new JSONArray();
for (BookmarkEntity bookmarkEntity : getBookmarks()) {
UriBuilder ub = uriInfo.getAbsolutePathBuilder();
URI bookmarkUri = ub.
path(bookmarkEntity.getBookmarkEntityPK().getBmid()).
build();
uriArray.put(bookmarkUri.toASCIIString());
}
return uriArray;
}
...
}
In Example 26, the annotated Java method, getBookmark, from the BookmarkResource
class in the Jersey bookmark sample, will process HTTP GET requests. This example
shows how to process the JSON object that is returned. For more information about the
Jersey bookmark sample, see Section 2.4.1, "About the Jersey Bookmark Sample."
Example 26
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
...
public class BookmarkResource {
...
@GET
@Produces(MediaType.APPLICATION_JSON)
public JSONObject getBookmark() {
return asJson();
}
...
public JSONObject asJson() {
try {
return new JSONObject()
.put("userid", bookmarkEntity.getBookmarkEntityPK().getUserid())
.put("sdesc", bookmarkEntity.getSdesc())
.put("ldesc", bookmarkEntity.getLdesc())
.put("uri", bookmarkEntity.getUri());
} catch (JSONException je){
return null;
}
}
}
2-8 Developing and Securing RESTful Web Services for Oracle WebLogic Server
import javax.ws.rs.PUT;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
...
public class BookmarkResource {
...
@PUT
@Consumes(MediaType.APPLICATION_JSON)
public void putBookmark(JSONObject jsonEntity) throws JSONException {
bookmarkEntity.setLdesc(jsonEntity.getString("ldesc"));
bookmarkEntity.setSdesc(jsonEntity.getString("sdesc"));
bookmarkEntity.setUpdated(new Date());
TransactionManager.manage(new Transactional(em) {
public void transact() {
em.merge(bookmarkEntity);
}});
}
}
import javax.ws.rs.DELETE;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
...
public class BookmarkResource {
...
@DELETE
public void deleteBookmark() {
TransactionManager.manage(new Transactional(em) {
public void transact() {
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
...
public class BookmarksResource {
...
@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response postForm(JSONObject bookmark) throws JSONException {
final BookmarkEntity bookmarkEntity = new
BookmarkEntity(getBookmarkId(bookmark.getString("uri")),
userResource.getUserEntity().getUserid());
bookmarkEntity.setUri(bookmark.getString("uri"));
bookmarkEntity.setUpdated(new Date());
bookmarkEntity.setSdesc(bookmark.getString("sdesc"));
bookmarkEntity.setLdesc(bookmark.getString("ldesc"));
userResource.getUserEntity().getBookmarkEntityCollection().add(bookmarkEntity);
TransactionManager.manage(new Transactional(em) {
public void transact() {
em.merge(userResource.getUserEntity());
}});
URI bookmarkUri = uriInfo.getAbsolutePathBuilder().
path(bookmarkEntity.getBookmarkEntityPK().getBmid()).
build();
return Response.created(bookmarkUri).build();
}
}
2.5 Customizing Media Types for the Request and Response Messages
Add the javax.ws.rs.Consumes or javax.ws.rs.Produces annotation at the class level
of the resource to customize the request and response media types, as described in the
following sections:
2-10 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Section 2.5.1, "How To Customize Media Types for the Request Message
(@Consumes)"
Section 2.5.2, "How To Customize Media Types for the Response Message
(@Produces)"
Section 2.5.3, "What Happens At Runtime: How the Resource Method Is Selected
for Response Messages"
2.5.1 How To Customize Media Types for the Request Message (@Consumes)
The javax.ws.rs.Consumes annotation enables you to specify the MIME media types
of representations a resource can consume that were sent from the client. The
@Consumes annotation can be specified at both the class and method levels and more
than one media type can be declared in the same @Consumes declaration.
If there are no methods in a resource that can consume the specified MIME media
types, the runtime returns an HTTP 415 Unsupported Media Type error.
For more information, see the @Consumes annotation in the Java EE 7 Specification APIs.
In Example 211, the @Consumes annotation defined for the Java class, helloWorld,
specifies that the class produces messages using the text/plain MIME media type.
Example 210
Customizing the Media Types for the Request Message Using @Consumes
package samples.consumes;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
...
@Path("/helloworld")
public class helloWorld {
...
@POST
@Consumes("text/plain")
public void postMessage(String message) {
// Store the message
}
}
2.5.2 How To Customize Media Types for the Response Message (@Produces)
The javax.ws.rs.Produces annotation enables you to specify the MIME media types
of representations a resource can produce and send back to the client. The @Produces
annotation can be specified at both the class and method levels and more than one
media type can be declared in the same @Produces declaration.
If there are no methods in a resource that can produce the specified MIME media
types, the runtime returns an HTTP 406 Not Acceptable error.
For more information, see the @Produces annotation in the Java EE 7 Specification APIs.
In Example 211, the @Produces annotation specified for the Java class, SomeResource,
specifies that the class produces messages using the text/plain MIME media type.
The doGetAsPlainText method defaults to the MIME media type specified at the class
level. The doGetAsHtml method overrides the class-level setting and specifies that the
method produces HTML rather than plain text.
Example 211
package samples.produces;
import javax.ws.rs.Produces;
import javax.ws.rs.Path;
@Path("/myResource")
@Produces("text/plain")
public class SomeResource {
@GET
public String doGetAsPlainText() { ... }
@GET
@Produces("text/html")
public String doGetAsHtml() { ... }
}
2.5.3 What Happens At Runtime: How the Resource Method Is Selected for Response
Messages
If a resource class is capable of producing more that one MIME media type, then the
resource method that is selected corresponds to the acceptable media type declared in
the Accept header of the HTTP request. In Example 211, if the Accept header is
Accept: text/html, then the doGetAsPlainText method is invoked.
If multiple MIME media types are included in the @Produces annotation and both are
acceptable to the client, the first media type specified is used. In Example 211, if the
Accept header is Accept: application/html, application/text, then the
doGetAsHtml method is invoked and the application/html MIME media type is used
as it is listed first in the list.
Annotation
Description
@BeanParam
Inject aggregated request parameters into a single bean. For more information, see the
@BeanParam annotation in the Java EE 7 Specification APIs.
For additional usage information, see "Parameter Annotations (@*Param)" in the Jersey 2.21
User Guide.
@CookieParam
Extract information from the HTTP cookie-related headers to initialize the value of a method
parameter. For more information, see the @CookieParam annotation in the Java EE 7
Specification APIs.
@DefaultValue
Define the default value of the request metadata that is bound using one of the following
annotations: @CookieParam, @FormParam, @HeaderParam, @MatrixParam, @PathParam, or
@QueryParam. For more information, see Section 2.6.3, "How to Define the DefaultValue
(@DefaultValue)."
@Encoded
Enable encoding of a parameter value that is bound using one of the following annotations:
@FormParam, @MatrixParam, @PathParam, or @QueryParam. For more information, see
Section 2.6.4, "Enabling the Encoding Parameter Values (@Encoded)."
@FormParam
2-12 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Table 24 (Cont.) javax.ws.rs Annotations for Extracting Information From the Request Message
Annotation
Description
@HeaderParam
Extract information from the HTTP headers to initialize the value of a method parameter.
For more information, see the @HeaderParam annotation in the Java EE 7 Specification APIs.
@MatrixParam
Extract information from the URI path segments to initialize the value of a method
parameter. For more information, see the @MatrixParam annotation in the Java EE 7
Specification APIs.
@PathParam
Define the relative URI as a variable value (referred to as "URI path template"). For more
information, see Section 2.6.1, "How to Extract Variable Information from the Request URI
(@PathParam)."
@QueryParam
Extract information from the query portion of the request URI to initialize the value of a
method parameter. For more information, see Section 2.6.2, "How to Extract Request
Parameters (@QueryParam)."
2.6.1 How to Extract Variable Information from the Request URI (@PathParam)
Add the javax.ws.rs.PathParam annotation to the method parameter of a resource to
extract the variable information from the request URI and initialize the value of the
method parameter. You can define a default value for the variable value using the
@DefaultValue annotation, as described in Section 2.6.3, "How to Define the
DefaultValue (@DefaultValue)."
In Example 23, the @PathParam annotation assigns the value of the username variable
that is defined as part of the URI path by the @Path annotation to the userName method
parameter.
Example 212
package samples.helloworld;
import
import
import
import
javax.ws.rs.GET;
javax.ws.rs.Path;
javax.ws.rs.Produces;
javax.ws.rs.PathParam;
User-defined type
Static method named valueOf or fromString that accepts a single String argument
(for example, integer.valueOf(String))
List<T>, Set<T>, or SortedSet<T>
If the @QueryParam annotation is specified but the associated query parameter is not
present in the request, then the parameter value will set as an empty collection for
List, Set or SortedSet, the Java-defined default for primitive types, and NULL for all
other object types. Alternatively, you can define a default value for the parameter
using the @DefaultValue annotation, as described in Section 2.6.3, "How to Define the
DefaultValue (@DefaultValue)."
For more information, see the @QueryParam annotation in the Java EE 7 Specification
APIs.
In Example 213, if the step query parameter exists in the query component of the
request URI, the value will be assigned to the step method parameter as an integer
value. If the value cannot be parsed as an integer value, then a 400 (Client Error)
response is returned. If the step query parameter does not exist in the query
component of the request URI, then the value is set to NULL.
Example 213
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
...
@Path("smooth")
@GET
public Response smooth(@QueryParam("step") int step)
{ ... }
}
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.QueryParam;
...
@Path("smooth")
@GET
public Response smooth(@DefaultValue("2") @QueryParam("step") int step)
{ ... }
}
2-14 Developing and Securing RESTful Web Services for Oracle WebLogic Server
package samples.helloworld;
import
import
import
import
import
javax.ws.rs.GET;
javax.ws.rs.Path;
javax.ws.rs.Produces;
javax.ws.rs.PathParam;
javax.ws.rs.Encoded;
Table 25
Method
Description
created()
Creates a new ResponseBuilder instance and sets the Location header to the
specified value.
fromResponse()
noContent()
notAcceptable()
notModified()
ok()
seeOther()
serverError()
status()
temporaryRedirect()
Once you create a ResponseBuilder instance, you can call the methods defined in
Table 26 to build a custom response. Then, call the build() method to create the final
Response instance. For more information, see the Response.ResponseBuilder methods
in the Java EE 7 Specification APIs.
Table 26
Method
Description
allow()
build()
cacheControl()
clone()
contentLocation()
cookie()
encoding()
entity()
expires()
header()
language()
lastModified()
link()
links()
location()
newInstance()
replaceAll()
status()
tag()
2-16 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Description
type()
variant()
variants()
Example 216 shows how to build a Response instance using ResponseBuilder. In this
example, the standard status code of 200 OK is returned and the media type of the
response is set to text/html. A call to the build() method creates the final Response
instance.
Example 216
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.ResponseBuilder;
...
@Path("/content")
public class getDocs {
@GET
@Path("{id}")
public Response getHTMLDoc(@PathParm("id") int docId)
{
Document document = ...;
ResponseBuilder response = Response.ok(document);
response.type("text/html");
return response.build();
}
}
If you wish to build an HTTP response using a generic type, to avoid type erasure at
runtime you need to create a javax.ws.rs.core.GenericEntity object to preserve the
generic type. For more information, see the GenericEntity methods in the Java EE 7
Specification APIs.
Example 217 provides an example of how to build an HTTP response using
GenericEntity to preserve the generic type.
Example 217
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.PathParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.ResponseBuilder;
javax.ws.rs.core.GenericEntity;
...
@Path("/content")
public class getDocs {
@GET
@Path("{id}")
public Response getHTMLDoc(@PathParm("id") int docId)
{
Document document = ...;
List<String> list = new ArrayList<String>();
Mapping HTTP Request and Response Entity Bodies Using Entity Providers
2.8 Mapping HTTP Request and Response Entity Bodies Using Entity
Providers
Table 27 lists the Java types that are supported automatically by HTTP request and
response entity bodies.
Table 27
Java Types Supported for HTTP Request and Response Entity Bodies
Java Type
byte[]
java.lang.String
java.io.InputStream
java.io.Reader
java.io.File
javax.activation.DataSource
javax.xml.transform.Source
javax.xml.bind.JAXBElement and
application-supplied JAXB classes
MultivaluedMap<String,String>
StreamingOutput
If your RESTful web service utilizes a type that is not listed in Table 27, you must
define an entity provider, by implementing one of the interfaces defined in Table 28,
to map HTTP request and response entity bodies to method parameters and return
types.
2-18 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Table 28 Entity Providers for Mapping HTTP Request and Response Entity Bodies to Method Parameters
and Return Types
Entity Provider
Description
javax.ws.rs.ext.Message Maps an HTTP request entity body to a method parameter for an HTTP request.
BodyReader
Optionally, you can use the @Consumes annotation to specify the MIME media types
supported for the entity provider, as described in "Customizing Media Types for the
Request and Response Messages" on page 2-10.
For example:
@Consumes("application/x-www-form-urlencoded")
@Provider
public class FormReader implements MessageBodyReader<NameValuePair> { ...
}
javax.ws.rs.ext.Message Maps the return value to an HTTP response entity body for an HTTP response.
Optionally, you can use the @Produces annotation to specify the MIME media types
BodyWriter
supported for the entity provider, as described in "Customizing Media Types for the
Request and Response Messages" on page 2-10.
For example:
@Produces("text/html")
@Provider
public class FormWriter implements
MessageBodyWriter<Hashtable<String, String>> { ... }
The following code excerpt provides an example of a class that contains a method
(getClass) that returns a custom type, and that requires you to write an entity
provider.
public class Class1
{
public String hello() { return "Hello"; }
public Class2 getClass(String name) { return new Class2(); };
}
public class Class2
{
public Class2() { }
}
2-19
Building URIs
Table 29
Context Types
To . . .
HttpHeaders
Providers
Request
Determine the best matching representation variant and to evaluate whether the
current state of the resource matches any preconditions defined. For more
information, see Section 2.11, "Using Conditional GETs."
SecurityContext
Access the security context and secure the RESTful web service. For more
information, see Section 5.4, "Securing RESTful Web Services Using
SecurityContext."
UriInfo
Access application and request URI information. For more information, see
Section 2.10, "Building URIs."
Example 218 shows how to obtain an instance of UriInfo using @Context and use it
to return an absolute path of the request URI as a UriBuilder instance. Then, using
UriBuilder build a URI for a specific user resource by adding the user ID as a path
segment and store it in an array. In this example, the UriInfo instance is injected into a
class field. This example is excerpted from the bookmark sample, as described in
Section 2.4.1, "About the Jersey Bookmark Sample."
Example 218
Building URIs
import javax.ws.rs.Path;
import javax.ws.rs.GET;
import javax.ws.rs.Produces;
import javax.ws.rs.core.UriBuilder;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.Context;
...
@Path("/users/")
public class UsersResource {
@Context UriInfo uriInfo;
2-20 Developing and Securing RESTful Web Services for Oracle WebLogic Server
...
@Produces("application/json")
public JSONArray getUsersAsJsonArray() {
JSONArray uriArray = new JSONArray();
for (UserEntity userEntity : getUsers()) {
UriBuilder ub = uriInfo.getAbsolutePathBuilder();
URI userUri = ub
.path(userEntity.getUserid())
.build();
uriArray.put(userUri.toASCIIString());
}
return uriArray;
}
}
...
@Path("/employee/{joiningdate}")
public class Employee {
Date joiningdate;
public Employee(@PathParam("joiningdate") Date joiningdate, @Context Request req,
@Context UriInfo ui) {
this.joiningdate = joiningdate;
...
this.tag = computeEntityTag(ui.getRequestUri());
if (req.getMethod().equals("GET")) {
Response.ResponseBuilder rb = req.evaluatePreconditions(tag);
// Preconditions met
if (rb != null) {
return rb.build();
}
// Preconditions not met
rb = Response.ok();
rb.tag(tag);
return rb.build();
}
}
}
Note:
For example:
GET http://<path_to_REST_app>/application.wadl
Alternatively, you can use the OPTIONS method to return the WADL for particular
resource.
Example 220 shows an example of a WADL for the simple RESTful web service
shown in Example 21.
Example 220
Example of a WADL
2-22 Developing and Securing RESTful Web Services for Oracle WebLogic Server
3
Developing RESTful Web Service Clients
3
This chapter describes how to develop Java EE web service clients that conform to the
Representational State Transfer (REST) architectural style using Jersey 2.x Java API for
RESTful Web Services (JAX-RS) 2.0 reference implementation (RI).
[4]
Note: Support for the Jersey 1.18 (JAX-RS 1.1RI) client APIs are
deprecated in this release of WebLogic Server but are maintained for
backward compatibility. For more information, see "Develop RESTful
Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)" on page A-1.
Task
More Information
For information about developing RESTful web service clients using Oracle
JDeveloper, see "Creating RESTful Web Services and Clients" in Developing Applications
with Oracle JDeveloper.
3-1
Example 31 Simple RESTful Web Service Client Using Jersey 2.x (JAX-RS 2.0 RI)
package samples.helloworld.client;
...
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Invocation;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
public class helloWorldClient{
public static void main(String[] args) {
Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://localhost:7101/restservice");
WebTarget resourceWebTarget;
resourceWebTarget = target.path("resources/helloworld");
Invocation.Builder invocationBuilder;
invocationBuilder = resourceWebTarget.request(
MediaType.TEXT_PLAIN_TYPE);
Response response = invocationBuilder.get();
System.out.println(response.getStatus());
System.out.println(response.readEntity(String.class));
...
}
...
}
For complete details, see "Client API" in Jersey 2.21 User Guide.
Create a Java SE client using your favorite IDE, such as Oracle JDeveloper. For
more information, see "Developing and Securing Web Services and Clients" in
Developing Applications with Oracle JDeveloper.
3-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
2.
3.
4.
Configure your environment for Oracle Web Services Manager (OWSM) policies.
This step is optional, required only if you are attaching OWSM security policies to
the RESTful web services client.
The configuration steps required vary based on the type of policy being attached.
Examples are provided below. For additional configuration requirements, see
"Configuring Java SE Applications to Use OPSS" in Securing Applications with
Oracle Platform Security Services.
Example: Basic Authentication
For example, to support basic authentication using the oracle/wss_http_token_
client_policy security policy, perform the following steps:
a.
b.
Create a wallet (cwallet.sso) in the same location that you copied the files in
step 2 that defines a map called oracle.wsm.security and the credential key
name that the client application will use (for example, weblogic-csf-key).
The location of the file cwallet.sso is specified in the configuration file
jps-config-jse.xml with the element <serviceInstance>.For more
information, see "Using a Wallet-based Credential Store" in Securing
Applications with Oracle Platform Security Services.
c.
On the Java command line, pass the following property defining the JPS
configuration file copied in step 1:
-Doracle.security.jps.config=<pathToConfigFile>
b.
On the Java command line, pass the following properties defining the JPS
configuration file copied in step 1:
3-3
For more information, see "Setting Up the WebLogic Server in Case of a Java
SE Application" in "Setting Up a One-Way SSL Connection to the LDAP" in
Securing Applications with Oracle Platform Security Services.
Define the trust store password:
-Djavax.net.ssl.trustStorePassword=<password>
3-4 Developing and Securing RESTful Web Services for Oracle WebLogic Server
4
Building, Packaging, and Deploying RESTful
Web Service Applications
4
[5This
]
chapter describes how to package and deploy Java EE web services that conform
to the Representational State Transfer (REST) architectural style using the Jersey 2.x
Java API for RESTful Web Services (JAX-RS) 2.0 reference implementation (RI).
4-1
Table 41
Packaging Option
Description
Application subclass
Servlet
Update the web.xml deployment descriptor to configure the servlet and mappings.
The method used depends on whether your Web application is using Servlet 3.0 or
earlier. For more information, see Section 4.2.2, "Packaging With a Servlet".
Default resource
If you do not configure the servlet context path in your configuration using either of
the options specified above, the WebLogic Server provides a default RESTful web
service application servlet context path, resources. For more information, see
Section 4.2.3, "Packaging as a Default Resource."
import javax.ws.rs.core.Application;
javax.ws.rs.ApplicationPath;
...
@ApplicationPath("resources")
public class MyApplication extends Application {
public Set<Class<?>> getClasses() {
Set<Class<?>> s = new HashSet<Class<?>>();
s.add(HelloWorldResource.class);
return s;
}
}
4-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Alternatively, use the following API to scan for root resource and provider classes for a
specified classpath or a set of package names:
Section 4.2.2.1, "How to Package the RESTful Web Service Application with Servlet
3.0"
Section 4.2.2.2, "How to Package the RESTful Web Service Application with Pre-3.0
Servlets"
The web.xml file is located in the WEB-INF directory in the root directory of your
application archive. For more information about the web.xml deployment descriptor,
see "web.xml Deployment Descriptor Elements" in Developing Web Applications,
Servlets, and JSPs for Oracle WebLogic Server.
4.2.2.1 How to Package the RESTful Web Service Application with Servlet 3.0
To package the RESTful Web Service application with Servlet 3.0, update the web.xml
deployment descriptor to define the elements defined in the following sections. The
elements vary depending on whether you include in the package a class that extends
javax.ws.rs.core.Application.
Section 4.2.2.1.1, "Packaging the RESTful Web Service Application Using web.xml
With Application Subclass"
Section 4.2.2.1.2, "Packaging the RESTful Web Service Application Using web.xml
Without Application Subclass"
For more information about any of the elements, see "servlet" in Developing Web
Applications, Servlets, and JSPs for Oracle WebLogic Server.
4.2.2.1.1 Packaging the RESTful Web Service Application Using web.xml With Application
Subclass If a class that extends javax.ws.rs.core.Application is packaged with
web.xml, then define the elements as described in Table 42. For an example, see
Example 42.
Table 42
Packaging the RESTful Web Service Application Using web.xml With Application Subclass
Element
Description
<servlet-name>
Set this element to the fully qualified name of the class that extends
javax.ws.rs.core.Application. You can specify multiple servlet entries to define
multiple Application subclass names.
4-3
Table 42
(Cont.) Packaging the RESTful Web Service Application Using web.xml With Application
Element
Description
<servlet-class>
Not required.
<init-param>
Not required.
<servlet-mapping>
Set as the base URI pattern that gets mapped to the servlet.
If not specified, one of the following values are used, in order of precedence:
The value resources. This is the default base URI pattern for RESTful web service
applications. For more information, see Section 4.2.3, "Packaging as a Default
Resource."
The following provides an example of how to update the web.xml file if a class that
extends javax.ws.rs.core.Application is packaged with web.xml.
Example 42
<web-app>
<servlet>
<servlet-name>org.foo.rest.MyApplication</servlet-name>
</servlet>
...
<servlet-mapping>
<servlet-name>org.foo.rest.MyApplication</servlet-name>
<url-pattern>/resources</url-pattern>
</servlet-mapping>
...
</web-app>
4.2.2.1.2 Packaging the RESTful Web Service Application Using web.xml Without Application
Subclass If a class that extends javax.ws.rs.core.Application is not packaged with
web.xml, then define the elements as described in Table 43.
Note: In this scenario, you cannot support multiple RESTful web
service applications.
4-4 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Table 43
Packaging the RESTful Web Service Application Using web.xml Without Application Subclass
Element
Description
<servlet-name>
<servlet-class>
<init-param>
Not required.
<servlet-mapping>
Set as the base URI pattern that gets mapped to the servlet. If not specified, this value
defaults to resources. For more information, see Section 4.2.3, "Packaging as a Default
Resource."
For more information about how this information is used in the base URI of the resource,
see Section 2.3.3, "What Happens at Runtime: How the Base URI is Constructed."
The following provides an example of how to update the web.xml file if an class that
extends javax.ws.rs.core.Application is not packaged with web.xml.
Example 43
<web-app>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
4.2.2.2 How to Package the RESTful Web Service Application with Pre-3.0 Servlets
Table 44 describes the elements to update in the web.xml deployment descriptor to
package the RESTful web service application with a pre-3.0 servlet.
4-5
Table 44
Element
Description
<servlet-name>
<servlet-class>
<init-param>
Set this element to define the class that extends the javax.ws.rs.core.Application:
<init-param>
<param-name>
javax.ws.rs.Application
</param-name>
<param-value>
ApplicationSubclassName
</param-value>
</init-param>
Alternatively, you can specify the packages to be scanned for resources and providers, as
follows:
<init-param>
<param-name>
jersey.config.server.provider.packages
</param-name>
<param-value>
project1
</param-value>
</init-param>
<init-param>
<param-name>
jersey.config.server.provider.scanning.recursive
</param-name>
<param-value>
false
</param-value>
</init-param>
<servlet-mapping>
Set as the base URI pattern that gets mapped to the servlet.
If not specified, one of the following values are used, in order of precedence:
The value resources. This is the default base URI pattern for RESTful web service
applications. For more information, see Section 4.2.3, "Packaging as a Default
Resource."
The following provides an example of how to update the web.xml file if an class that
extends javax.ws.rs.core.Application is not packaged with web.xml.
4-6 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Example 44
<web-app>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>org.foo.myresources,org.bar.otherresources</param-value>
</init-param>
<init-param>
<param-name>jersey.config.server.provider.scanning.recursive</param-name>
<param-value>false</param-value>
</init-param>
...
</servlet>
...
</web-app>
You did not update the web.xml deployment descriptor to include a Servlet
mapping, as described in Section 4.2.2, "Packaging With a Servlet."
The @ApplicationPath annotation is not defined in the
javax.ws.rs.core.Application subclass, as described in Section 4.2.1, "Packaging
With an Application Subclass."
Note: If a servlet is already registered at the default context path,
then a warning is issued.
For example, if the relative URI of the root resource class for the RESTful web service
application is defined as @Path('/helloworld') and the default RESTful web service
application context path is used, then the RESTful web service application resource
will be available at:
http://<host>:<port>/<contextPath>/resources/helloworld
4-7
4-8 Developing and Securing RESTful Web Services for Oracle WebLogic Server
5
Securing RESTful Web Services and Clients
5
This chapter describes how to secure Java EE web services that conform to the
Representational State Transfer (REST) architectural style using Java API for RESTful
Web Services (JAX-RS) reference implementation (RI).
[6]
Attaching Oracle Web Services Manager (OWSM) policies. See Section 5.2,
"Securing RESTful Web Services and Clients Using OWSM Policies".
Updating the web.xml deployment descriptor to access information about the
authenticated users. See Section 5.3, "Securing RESTful Web Services Using
web.xml".
Using the javax.ws.rs.core.SecurityContext interface to access security-related
information for a request. See Section 5.4, "Securing RESTful Web Services Using
SecurityContext".
Applying annotations to your JAX-RS classes. See Section 5.5, "Securing RESTful
Web Services Using Java Security Annotations".
For information about developing RESTful web service clients using Oracle
JDeveloper, see "How to Attach Policies to RESTful Web Services and Clients" in
Developing Applications with Oracle JDeveloper.
5.2 Securing RESTful Web Services and Clients Using OWSM Policies
Only a subset of OWSM security policies are supported for RESTful web services, as
described in "Which OWSM Policies Are Supported for RESTful Web Services" in
Securing Web Services and Managing Policies with Oracle Web Services Manager.
You can attach OWSM security policies to RESTful web services using one of the
following methods:
Securing RESTful Web Services and Clients 5-1
C:\Oracle\Middleware\oracle_common\common\bin> wlst.cmd
...
wls:/offline> connect("weblogic","password","t3://myAdminServer.example.com:7001")
Connecting to t3://myAdminServer.example.com:7001" with userid weblogic ...
Successfully connected to Admin Server "AdminServer" that belongs to domain "my_domain".
Warning: An insecure protocol was used to connect to the
server. To ensure on-the-wire security, the SSL port or
Admin port should be used instead.
wls:/my_domain/serverConfig> beginWSMSession()
Location changed to domainRuntime tree. This is a read-only tree with DomainMBean as the root.
For more help, use help('domainRuntime')
Session started for modification.
wls:/my_domain/serverConfig> selectWSMPolicySubject('weblogic/my_domain/jaxrs_pack', '#jaxrs_
pack.war', 'REST-Resource(Jersey)')
The policy subject is selected for modification.
wls:/my_domain/serverConfig> attachWSMPolicy('oracle/http_basic_auth_over_ssl_service_policy')
Policy reference "oracle/http_basic_auth_over_ssl_service_policy" added.
wls:/my_domain/serverConfig> commitWSMSession()
The policy set for subject "/weblogic/my_domain/jaxrs_pack|#jaxrs_pack.war|REST-Resource(Jersey)"
was saved successfully.
5-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
For example, to secure your RESTful web service using basic authentication, perform
the following steps:
1.
Define a <security-constraint> for each set of RESTful resources (URIs) that you
plan to protect.
2.
Use the <login-config> element to define the type of authentication you want to
use and the security realm to which the security constraints will be applied.
3.
Define one or more security roles using the <security-role> tag and map them to
the security constraints defined in step 1. For more information, see "security-role"
in Developing Applications with the WebLogic Security Service.
4.
The following shows an example of how to secure a Jersey 2.x (JAX-RS 2.0) RESTful
web service using basic authentication.
Example 52
<web-app>
<servlet>
<servlet-name>RestServlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RestServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<security-constraint>
<web-resource-collection>
<web-resource-name>Orders</web-resource-name>
<url-pattern>/orders</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
</web-app>
Whether the request was made using a secure channel, such as HTTPS.
You access the SecurityContext by injecting an instance into a class field, setter
method, or method parameter using the javax.ws.rs.core.Context annotation.
For more information, see the following in the Java EE 7 Specification APIs:
SecurityContext interface
@Context annotation
package samples.helloworld;
import
import
import
import
import
javax.ws.rs.GET;
javax.ws.rs.Path;
javax.ws.rs.Produces;
javax.ws.rs.core.SecurityContext;
javax.ws.rs.core.Context;
...
@Path("/stateless")
@Stateless(name = "JaxRSStatelessEJB")
public class StlsEJBApp {
...
@GET
@Produces("text/plain;charset=UTF-8")
@Path("/hello")
public String sayHello(@Context SecurityContext sc) {
if (sc.isUserInRole("admin")) return "Hello World!";
throw new SecurityException("User is unauthorized.");
}
Annotation
Description
@DenyAll
Specifies that no security roles are allowed to invoke the specified methods.
@PermitAll
Specifies that all security roles are allowed to invoke the specified methods.
@RolesAllowed
Specifies the list of security roles that are allowed to invoke the methods in the
application.
5-4 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Before you can use the annotations defined in Table 51, you must register the
roles-allowed feature, as described in "Securing JAX-RS resources with standard
javax.annotation.security annotations" in the Jersey 2.21 User Guide.
Example 54 shows how to define the security roles that are allowed, by default, to
access the methods defined in the helloWorld class. The sayHello method is
annotated with the @RolesAllows annotation to override the default and only allow
users that belong to the ADMIN security role.
Example 54
package samples.helloworld;
import
import
import
import
javax.ws.rs.GET;
javax.ws.rs.Path;
javax.ws.rs.Produces;
javax.annotation.Security.RolesAllowed;
@Path("/helloworld")
@RolesAllowed({"ADMIN", "ORG1"})
public class helloWorld {
@GET
@Path("sayHello")
@Produces("text/plain")
@RolesAllows("ADMIN")
public String sayHello() {
return "Hello World!";
}
}
javax.annotation.security Javadoc
5-6 Developing and Securing RESTful Web Services for Oracle WebLogic Server
6
Testing RESTful Web Services
6
This chapter describes how to test Java EE web services that conform to the
Representational State Transfer (REST) architectural style using Java API for RESTful
Web Services (JAX-RS).
[7]
After you have deployed a Web application that contains a RESTful web service to
WebLogic Server, you can test your application.
Table 61 lists the methods that can be employed to test your RESTful web service.
Table 61
Method
Description
Enterprise Manager
Fusion Middleware
Control
Use the test interface provided with Enterprise Manager Fusion Middleware Control
to test the RESTful web service resource methods. For more information, see "Testing
a RESTful Web Service" in Securing Web Services and Managing Policies with Oracle Web
Services Manager.
WebLogic Server
Administration Console
Navigate to the Testing tab for your application deployment in the WebLogic Server
Administration Console to validate the application deployment and view the WADL
file. For more information, see "Test RESTful web services" in Oracle WebLogic Server
Administration Console Online Help.
6-1
6-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
7
Monitoring RESTful Web Services and Clients
7
[8This
]
chapter describes how to monitor Java EE web services that conform to the
Representational State Transfer (REST) architectural style using Java API for RESTful
Web Services (JAX-RS).
Monitoring RESTful Web Services Using Enterprise Manager Fusion Middleware Control
Table 71
Method
Description
Logging filter
In addition to the monitoring methods described in Table 71, Jersey 2.x (JAX-RS 2.0
RI) provides additional monitoring features, including support for event listeners and
statistics monitoring. For more information, see "Monitoring Jersey Applications" in
the Jersey 2.21 User Guide.
Note: RESTful web service monitoring is enabled by default. In some
cases, this may result in increased memory consumption. You can
disable the monitoring feature at the domain level, and at the
application level. For more information, see "Disabling RESTful Web
Service Application Monitoring" on page 7-6.
Invoke the WebLogic Server Administration Console in your browser using the
following URL:
http://[host]:[port]/console
where:
7-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
2.
port refers to the port number on which WebLogic Server is listening (default
value is 7001).
Run-time MBean
Description
RequestStatistics
ResourceConfig
ResponseStatistics
RootResources
Table 72
Run-time MBean
Description
RootResourcesByClass
RootResourcesbyURI
Servlet
To monitor RESTful web services using WLST, perform the steps provided in the
following procedure.
In this procedure, the example steps provided demonstrate how to monitor the
JAX-RS 2.0 Asynchronous Processing sample delivered with the WebLogic Server
Samples Server, described at "Sample Applications and Code Examples" in
Understanding Oracle WebLogic Server
1.
2.
3.
4.
7-4 Developing and Securing RESTful Web Services for Oracle WebLogic Server
('AdminServer_/jaxrs-async')
5.
Navigate to the application run-time MBean for the RESTful web service request
statistics.
For example:
wls:/samples/serverRuntime/ApplicationRuntimes/jaxrs-async/ComponentRuntimes>
cd ('AdminServer_/jaxrs-async'
wls:/samples_
domain/serverRuntime/ApplicationRuntimes/jaxrs-async/ComponentRuntimes/AdminSer
ver_/jaxrs-async>
cd
('JaxRsApplications/examples.javaee7.jaxrs.async.MessageApplication/RequestStat
istics/examples.javaee7.jaxrs.async.MessageApplication_RequestStatistics')
6.
Review the monitoring information displayed for the RESTful web service
application. For more information, see "JaxRsApplicationRuntimeBean" in the
MBean Reference for Oracle WebLogic Server.
For example:
wls:/samples/serverRuntime/ApplicationRuntimes/jaxrs-async/ComponentRuntimes/Ad
minServer_/jaxrs-async
/JaxRsApplications/examples.javaee7.jaxrs.async.MessageApplication/RequestStati
stics
/examples.javaee7.jaxrs.async.MessageApplication_RequestStatistics>
ls()
-r-AvgTimeLast15m
-1
-r-AvgTimeLast15s
-1
-r-AvgTimeLast1h
-1
-r-AvgTimeLast1m
-1
-r-AvgTimeLast1s
-1
-r-AvgTimeTotal
0
-r-MaxTimeLast15m
-1
-r-MaxTimeLast15s
-1
-r-MaxTimeLast1h
-1
-r-MaxTimeLast1m
-1
-r-MaxTimeLast1s
-1
-r-MaxTimeTotal
0
-r-MinTimeLast15m
-1
-r-MinTimeLast15s
-1
-r-MinTimeLast1h
-1
-r-MinTimeLast1m
-1
-r-MinTimeLast1s
-1
-r-MinTimeTotal
0
-r-Name
examples.javaee7.jaxrs.async.MessageApplication_RequestStatisti
cs
-r-RequestCountLast15m
0
-r-RequestCountLast15s
0
-r-RequestCountLast1h
0
-r-RequestCountLast1m
0
-r-RequestCountLast1s
0
-r-RequestCountTotal
0
-r-RequestRateLast15m
0.0
-r-RequestRateLast15s
0.0
-r-RequestRateLast1h
0.0
-r-RequestRateLast1m
0.0
-r-RequestRateLast1s
0.0
-r-RequestRateTotal
0.0
-r-Type
JaxRsExecutionStatisticsRuntime
wls:/samples/serverRuntime/ApplicationRuntimes/jaxrs-async/ComponentRuntimes/Ad
minServer_/jaxrs-async
/JaxRsApplications/examples.javaee7.jaxrs.async.MessageApplication/RequestStati
stics
/examples.javaee7.jaxrs.async.MessageApplication_RequestStatistics>
7.
8.
At the application level, you can set a WebLogic Server-specific Jersey 2.x
application property, jersey.config.wls.server.monitoring.enabled. For more
information, see "Disabling Monitoring for a RESTful Web Service Application
Using Jersey Property" on page 7-7.
At both the application level and at the domain level, you can disable monitoring
using a WebLogic Configuration MBean,
WebAppComponentMBean.JaxRsMonitoringDefaultBehavior. For more information,
see "Disabling Monitoring for a RESTful Web Service Application Using WebLogic
Configuration MBean" on page 7-9 and "Disabling RESTful Web Service
7-6 Developing and Securing RESTful Web Services for Oracle WebLogic Server
2.
3.
4.
WebLogic Server uses the default setting, which is to enable JAX-RS monitoring
for the application if none of the configuration properties in the previous steps
have been set.
7.6.1 Disabling Monitoring for a RESTful Web Service Application Using Jersey
Property
Jersey 2.x supports the following WebLogic Server-specific property that you can use
to disable application monitoring for an individual RESTful web service application:
jersey.config.wls.server.monitoring.enabled
Setting this property to false disables monitoring in the application. You can set this
property programmatically in the JAX-RS application subclass code, or declaratively
via Servlet init parameters specified in the web.xml as shown in the following
examples.
For convenience, the property name is stored in the
weblogic.jaxrs.server.WeblogicServerProperties.MONITORING_ENABLED constant
field.
Example 71 provides an example of how you can disable monitoring
programmatically in a RESTful web service application by extending the JAX-RS
Application class.
Example 71 Disable Application Monitoring Programmatically by Extending the JAX-RS
Application Class
ApplicationPath("/")
public class MyApplication extends Application {
public Map<String, Object> getProperties() {
final Map<String, Object> properties = new HashMap<>();
// Disable JAX-RS Application monitoring (and WLS console monitoring) for this
internal application.
properties.put(weblogic.jaxrs.server.WeblogicServerProperties.MONITORING_
ENABLED, false);
return properties;
}
}
7-8 Developing and Securing RESTful Web Services for Oracle WebLogic Server
7.6.2 Disabling Monitoring for a RESTful Web Service Application Using WebLogic
Configuration MBean
After you have deployed a RESTful web service application on WebLogic Server, you
can disable monitoring of the application by using WLST, for example, to set the
JaxRsMonitoringDefaultBehavior property to false on its WebAppComponentMBean:
webAppComponentMBean.setJaxRsMonitoringDefaultBehavior("false")
This is a per-application property that is internally used by Jersey/WebLogic
integration code to determine the state of the default monitoring behavior in the
JAX-RS application:
If the property is not set, then the domain-level Web Application Container
property WebAppContainerMBean.isJaxRsMonitoringDefaultBehavior()) is used
as a fall-back.
Note: The value of this application-specific property (if set) overrides
the value of domain-level configuration property.
7.6.3 Disabling RESTful Web Service Application Monitoring for a WebLogic Domain
Application monitoring is enabled by default for all RESTful web service applications
deployed to a WebLogic domain. It is possible to reverse this default behavior in a
WebLogic domain and disable JAX-RS monitoring for all RESTful web service
applications deployed in the domain (unless overridden by an application-specific
configuration) by setting the JaxRsMonitoringDefaultBehavior property on
WebAppContainerMBean to false:
WebAppContainerMBean.setJaxRsMonitoringDefaultBehavior("false")
This Web Application Container property is a domain-level property used by
Jersey/WebLogic integration code to determine the behavior of monitoring in JAX-RS
applications at the domain level:
If set to true (or not set), then JAX-RS monitoring is enabled (if not overridden by
properties set directly in an application). By default this property is not set
explicitly and monitoring is enabled.
If set to false, then monitoring for all JAX-RS applications is disabled by default
for the given domain.
Note: You can override this domain-level setting in each JAX-RS
application by setting similar properties,
WebAppComponentMBean#isJaxRsMonitoringDefaultBehavior()), at
the application level. For more information, see "Disabling Monitoring
for a RESTful Web Service Application Using WebLogic Configuration
MBean" on page 7-9.
Example 74 provides a sample WLST script that disables JAX-RS monitoring for the
entire domain by default.
Example 74 Sample WLST Script for Disabling JAX-RS Monitoring at Domain Level
connect(<user>, <password>)
edit()
startEdit()
cd("WebAppContainer/<domain_name>/")
cmo.setJaxRsMonitoringDefaultBehavior(false)
activate()
Note:
Resources exposing the WADL for the entire JAX-RS application, as well as a
partial WADL for any deployed resource.
OPTIONS method handlers for each resource or resource method of the JAX-RS
application.
7-10 Developing and Securing RESTful Web Services for Oracle WebLogic Server
HEAD method handlers for each resource or resource method of the JAX-RS
application.
7-11
7-12 Developing and Securing RESTful Web Services for Oracle WebLogic Server
8
Using Server-Sent Events in WebLogic Server
8
This chapter explains how to use server-sent events in WebLogic Server. Support for
server-sent events in WebLogic Server is provided through the integration of the Jersey
2.x library. The Jersey 2.x library provides the Reference Implementation (RI) of
JSR-339 (JAX-RS 2.0: Java API for RESTful Web Services).
[9]
Server-sent events can only push data to the client, while WebSocket technology
can both send and receive data from a client.
The simpler server-sent events communication model is better suited for
server-only updates, while WebSocket technology requires additional
programming for server-only updates.
Server-sent events are sent over standard HTTP and therefore do not require any
special protocol or server implementation to work. WebSocket technology requires
the server to understand the WebSocket protocol to successfully upgrade an HTTP
connection to a WebSocket connection.
For more information about WebSocket technology, see "Using the WebSocket Protocol
in WebLogic Server" in Developing Applications for Oracle WebLogic Server.
https://github.com/jersey/jersey/tree/master/examples/server-sent-events
https://github.com/jersey/jersey/tree/master/examples/sse-item-store-weba
pp
https://github.com/jersey/jersey/tree/master/examples/sse-twitter-aggrega
tor
8-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
A
Compatibility with Earlier Jersey/JAX-RS
Releases
This appendix describes Jersey 1.x (JAX-RS 1.1 RI) features that have been deprecated
or are no longer supported, but have been maintained for backward compatibility.
[10]
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
Support for Jersey 1.18 (JAX-RS 1.1 RI) Deployments Packaged with Pre-3.0
Servlets
A.1 Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1
RI)
Note: Support for the client packages described in this section,
including the com.sun.jersey package, its nested packages, and the
weblogic.jaxrs.api.client package, is deprecated in this release of
WebLogic Server.
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
Table A1
Task
More Information
For information about developing RESTful web service clients using Oracle
JDeveloper, see "Creating RESTful Web Services and Clients" in Developing Applications
with Oracle JDeveloper.
The Client instance is created to access the client API. For more information, see
Section A.1.2, "Creating and Configuring a Client Instance."
The WebResource instance is created to access the Web resource. For more
information, see Section A.1.3, "Creating a Web Resource Instance."
A get request is sent to the resource. For more information, see Section A.1.4,
"Sending Requests to the Resource."
The response is returned as a String value. For more information about receiving
the response, see Section A.1.5, "Receiving a Response from a Resource."
Additional examples are listed in Section 1.5, "Learn More About RESTful Web
Services."
Example A1 Simple RESTful Web Service Client Using Jersey 1.18 (JAX-RS 1.1 RI)
package samples.helloworld.client;
import weblogic.jaxrs.api.client.Client;
import com.sun.jersey.api.client.WebResource;
public class helloWorldClient {
public helloWorldClient() {
super();
}
public static void main(String[] args) {
Client c = Client.create();
WebResource resource =
c.resource("http://localhost:7101/RESTfulService/jersey/helloworld");
String response = resource.get(String.class);
System.out.println(response);
}
}
A-2 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
Optionally, you can pass client configuration properties, defined in Table A2, when
creating the client instance by defining a
com.sun.jersey.api.client.config.ClientConfig and passing the information to
the create method. For more information, see the ClientConfig interface in the
jersey-bundle 1.18 API.
Table A2
Property
Description
PROPERTY_BUFFER_RESPONSE_ENTITY_ON_EXCEPTION
PROPERTY_CHUNKED_ENCODING_SIZE
PROPERTY_CONNECT_TIMEOUT
PROPERTY_FOLLOW_REDIRECTS
PROPERTY_READ_TIMEOUT
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
...
Alternatively, you can configure a client instance after the client has been created, by
setting properties on the map returned from the getProperties method or calling a
specific setter method.
Example A4 provides an example of how to configure a client after it has been
created. In this example:
WebResource
AsyncWebResource
A-4 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
Table A3
Building a Request
Method
Description
accept()
Defines the acceptable media types. See Section A.1.4.4, "How to Configure the
Accept Header."
acceptLanguage()
cookie()
entity()
Configures the request entity. See Section A.1.4.6, "How to Configure the Request
Entity."
header()
Adds an HTTP header and value. See Section A.1.4.4, "How to Configure the Accept
Header."
type()
Configures the media type. See Section A.1.4.6, "How to Configure the Request
Entity."
Method
Description
get()
head()
Invoke the HTTP HEAD method to get the meta-information of the resource.
options()
Invoke the HTTP OPTIONS method to get the HTTP methods that the JAX-RS service
supports.
post()
Invoke the HTTP POST method to create or update the representation of the specified
resource.
put()
Invoke the HTTP PUT method to update the representation of the resource.
delete()
Invoke the HTTP DELETE method to delete the representation of the resource.
If the response has an entity (or representation), then the Java type of the instance
required is declared in the HTTP method.
Example A8 provides an example of how to send an HTTP GET request. In this
example, the response entity is requested to be an instance of String. The response
entity will be de-serialized to a String instance.
Example A8 Sending an HTTP GET Request
import com.sun.jersey.api.client.WebResource;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
String response = resource.get(String.class);
...
A-6 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
Example A9 provides an example of how to send an HTTP PUT request and put the
entity foo:bar into the Web resource. In this example, the response entity is requested
to be an instance of com.sun.jersey.api.client.ClientResponse.
Example A9 Sending an HTTP PUT Request
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.ClientResponse;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
ClientResponse response = resource.put(ClientResponse.class, "foo:bar");
...
If you wish to send an HTTP request using a generic type, to avoid type erasure at
runtime, you need to create a com.sun.jersey.api.client.GenericType object to
preserve the generic type. For more information, see the GenericType class in
jersey-bundle 1.18 API.
Example A10 provides an example of how to send an HTTP request using a generic
type using GenericType to preserve the generic type.
Example A10 Sending an HTTP GET Request Using a Generic Type
import com.sun.jersey.api.client.WebResource;
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
List<String> list = resource.get(new GenericType<List<String>>() {});
...
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
Example A15 provides an example of how to configure the request entity media type
only.
Example A15 Configuring the Request Entity Media Type Only
import com.sun.jersey.api.client.WebResource;
A-8 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Develop RESTful Web Service Clients Using Jersey 1.18 (JAX-RS 1.1 RI)
...
public static void main(String[] args) {
...
WebResource resource = c.resource("http://example.com/helloWorld");
String response = resource.type(MediaType.TEXT_PLAIN_TYPE).get(String.class);
...
Support for Jersey 1.18 (JAX-RS 1.1 RI) Deployments Packaged with Pre-3.0 Servlets
...
Using filters
A.2 Support for Jersey 1.18 (JAX-RS 1.1 RI) Deployments Packaged with
Pre-3.0 Servlets
For backwards compatibility, deployments that reference the servlet classes shown in
Table A5 are supported. This table describes the elements to update in the web.xml
deployment descriptor to package the RESTful web service application with a pre-3.0
servlet.
Table A5
Element
Description
<servlet-name>
A-10 Developing and Securing RESTful Web Services for Oracle WebLogic Server
Support for Jersey 1.18 (JAX-RS 1.1 RI) Deployments Packaged with Pre-3.0 Servlets
Table A5 (Cont.) Packaging the RESTful Web Service Application with Pre-3.0 Servlets
Element
Description
<servlet-class>
Set this element to one of the following classes to delegate all Web requests to the Jersey
servlet:
weblogic.jaxrs.server.portable.servlet.ServletContainer
com.sun.jersey.spi.container.servlet.ServletContainer
Set this element to define the class that extends the javax.ws.rs.core.Application:
<init-param>
<init-param>
<param-name>
javax.ws.rs.Application
</param-name>
<param-value>
ApplicationSubclassName
</param-value>
</init-param>
Alternatively, you can declare the packages in your application, as follows:
<init-param>
<param-name>
com.sun.jersey.config.property.packages
</param-name>
<param-value>
project1
</param-value>
</init-param>
<servlet-mapping>
Set as the base URI pattern that gets mapped to the servlet.
If not specified, one of the following values are used, in order of precedence:
The value resources. This is the default base URI pattern for RESTful web service
applications. For more information, see Section 4.2.3, "Packaging as a Default
Resource."
The following provides an example of how to update the web.xml file if a class that
extends javax.ws.rs.core.Application is not packaged with web.xml.
Example A18 Updating web.xml for Pre-3.0 Servlets
<web-app>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>weblogic.jaxrs.server.portable.servlet.ServletContainer</servlet-class>
<init-param>
A-11
Support for Jersey 1.18 (JAX-RS 1.1 RI) Deployments Packaged with Pre-3.0 Servlets
<param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
<param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>org.foo.rest;org.bar.rest</param-value>
</init-param>
...
</servlet>
...
</web-app>
A-12 Developing and Securing RESTful Web Services for Oracle WebLogic Server