h2. Apache Wink 1.1.2 Release Notes

h3. Overview
 
This is the fifth official release of Apache Wink project.
Apache Wink is a framework that helps you to produce and consume RESTful Web Services. 
Apache Wink is TCK compliant implementation of the JAX-RS v1.1 specification. 
The project also introduces Java API for writing clients that consume HTTP-based RESTful Web Services. 

h3. Complete list of issues fixed in 1.1.2

h4. Bug
    * WINK-286 - GET methods fail to serve requests without Content-Type if the class/interface has @Consumes
    * WINK-292 - Add proxy authentification support for the RestClient
    * WINK-307 - Fix obscure error message during Service Doc generation
    * WINK-311 - Resource Locator's @PathParam resolution is not correct.
    * WINK-312 - GenericsUtils.isAssignable() cannot handle primitive types
    * WINK-316 - AdminServlet doesn't process QueryParams properly
    * WINK-317 - HttpHeadersImpl.getCookies() only ever returns the first cookie in the Cookie header
    * WINK-320 - The JSON4J tests are failing due to not being able to find test resources

h4. Improvement
    * WINK-287 - Support web beans / (J)CDI / JSR-299
    * WINK-294 - Some plugins missing versions
    * WINK-295 - Upgrade to SLF4J 1.6.0
    * WINK-296 - DEBUG -> TRACE logging reform
    * WINK-297 - serviceability improvement; externalize strings, confirm formatting
    * WINK-299 - Make Jackson the default JSON provider for Wink
    * WINK-304 - serviceability improvement, output information upon application registration, errors
    * WINK-305 - allow configuration file for SSL
    * WINK-310 - Annotations inherited by a resource class should determine parameter type from the subclass, not the superclass
    * WINK-315 - Improve the tolerance of malformed media types
    * WINK-319 - Simplify addition of Request/Response handlers
    * WINK-325 - Allow AtomCommonAttributes#otherAttributes and AtomCommonAttributesSimpleContent#otherAttributes to be lazy initialized.

h4. New Feature
    * WINK-313 - WADL support
    * WINK-318 - Wink JSON model
    * WINK-321 - Support @XmlJavaTypeAdapter and @XmlElement on method params
    * WINK-322 - Add JSR250 life cycle management support
    * WINK-326 - AsyncHttpClient module

h4. Test
    * WINK-298 - enhance DTD expansion tests
