h2. Apache Wink 1.1.3 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.3

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
    * WINK-332 - JAXBXmlProvider blocks JAXB implementation from successfully parsing XML when no concrete type can be found.
    * WINK-339 - org.apache.wink.test.mock.MockHttpServletRequestWrapper doesn't handle getContentType() and parameter related methods

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
    * WINK-336 - Add a wink provider for Google Protocol Buffer
    * WINK-337 - Add a wink provider for Apache Thrift

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