Search code examples
javajerseyzk

ZK framework with Jersey


My ZK project doesn't see Jersey MessageBodyWriter when I do request to the server.

    Client client = ClientBuilder.newClient();

    WebTarget baseTarget = client.target("target");

    Response postResponse = baseTarget.request().post(Entity.text(transaction));

add to web.xml:

<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>ua.sustavov.payment.service, org.codehaus.jackson.jaxrs</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey Web Application</servlet-name>
    <url-pattern>/api/*</url-pattern>
</servlet-mapping>

MessageBodyWriter:

@Provider
@Produces(MediaType.TEXT_PLAIN)
public class TransactionMessageBodyWriter implements MessageBodyWriter<Transaction> {

    @Override
    public boolean isWriteable(Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType) {
        return Transaction.class.isAssignableFrom(aClass);
    }

    @Override
    public void writeTo(Transaction transaction, Class<?> aClass, Type type, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> multivaluedMap, OutputStream outputStream) throws IOException, WebApplicationException {

        outputStream.write(transaction.toString().getBytes());
    }

    @Override
    public long getSize(Transaction transaction, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

When I whant to send request? my App doesn't see MessageBodyWriter Thanks!


Solution

  • The writer is not going to get picked up by the Client automatically, like it would on the server side (when package scanning). You need to explicitly register it

    Client client = ClientBuilder.newClient();
    client.register(TransactionMessageBodyWriter.class);
    

    Or you can even register it with the WebTarget

    WebTarget baseTarget = client.target("target");
    baseTarget.register(TransactionMessageBodyWriter.class);