On Sun, Jan 13, 2013 at 12:41 PM, Sergey Beryozkin <[email protected]> wrote:
> Hi
>
> On 13/01/13 02:46, Benson Margulies wrote:
>>
>> I mischaracterized the problem.
>>
>> @Path("docView")
>> @Consumes("application/json")
>> @Produces("application/json")
>> @GZIP
>> public class DocumentViewService extends JugServiceWithSession {
>>      private static final Logger LOG =
>> LoggerFactory.getLogger(DocumentViewService.class);
>>      private QueryService queryService;
>>
>>      public DocumentViewService() {
>>      }
>>
>>      @Path("/{docId}/html")
>>       public Response documentHtml(@PathParam("docId") String docId)
>> throws Exception {
>>       ,,,
>>       }
>>
>> No matter what my function returns, CXF goes and tries to locate a
>> subresource, fails, and makes a 404.
>>
>> I'm sure I'm missing something simple here.
>>
>> Note that my function *is invoked*, so I'm quite confused about why
>> CXF is looking for subresources after i it returns.
>>
>> Hmm, Notice the lack of @GET or the like up there? Adding it fixed
>> things right up.
>>
> If a method has @Path but no @GET or other HTTP verb annotation, it is a
> subresource locator method - it is expected to return an object which will
> further be used to find a final matching resource method; note the
> subresource object return from a method like documentHtml can return other
> subresources, etc.
>
> I think returning Response from a subresource locator method is probably
> invalid and will have to be reported as a validation issue in 2.0, I'll ask
> for the confirmation on it.

Well, *that* certainly explains it! Thanks.

>
> Cheers, Sergey
>
>
>>
>> On Sat, Jan 12, 2013 at 9:28 PM, Benson Margulies<[email protected]>
>> wrote:
>>>
>>> In a JAX-RS method, I returned a response with a 404 status code.
>>>
>>> org.apache.cxf.jaxrs.JAXRSInvoker#invoke proceeded to treat this as if
>>> there was a missing subresource, instead of just treating it as the
>>> definitive response.  I quote the code below. I still get a 404, but
>>> not with the payload I asked for, which is sort of unfortunate. Is
>>> there a right way to do this?
>>>
>>>
>>>          ClassResourceInfo subCri = null;
>>>          if (ori.isSubResourceLocator()) {
>>>              try {
>>>                  Message msg = exchange.getInMessage();
>>>                  MultivaluedMap<String, String>  values =
>>> getTemplateValues(msg);
>>>                  String subResourcePath =
>>> values.getFirst(URITemplate.FINAL_MATCH_GROUP);
>>>                  String httpMethod =
>>> (String)msg.get(Message.HTTP_REQUEST_METHOD);
>>>                  String contentType =
>>> (String)msg.get(Message.CONTENT_TYPE);
>>>                  if (contentType == null) {
>>>                      contentType = "*/*";
>>>                  }
>>>                  List<MediaType>  acceptContentType =
>>>
>>> (List<MediaType>)msg.getExchange().get(Message.ACCEPT_CONTENT_TYPE);
>>>
>>>                  result = checkResultObject(result, subResourcePath);
>>>
>>>                  subCri = cri.getSubResource(
>>>                       methodToInvoke.getReturnType(),
>>>                       ClassHelper.getRealClass(result));
>>>                  if (subCri == null) {
>>>                      org.apache.cxf.common.i18n.Message errorM =
>>>                          new
>>> org.apache.cxf.common.i18n.Message("NO_SUBRESOURCE_FOUND",
>>>                                                                 BUNDLE,
>>>
>>> subResourcePath);
>
>
>
> --
> Sergey Beryozkin
>
> Talend Community Coders
> http://coders.talend.com/
>
> Blog: http://sberyozkin.blogspot.com

Reply via email to