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.
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