ZK 框架与 Jersey

ZK framework with Jersey

当我向服务器发出请求时,我的 ZK 项目没有看到 Jersey MessageBodyWriter。

    Client client = ClientBuilder.newClient();

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

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

添加到 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;
    }

我什么时候发送请求?我的应用程序没有看到 MessageBodyWriter 谢谢!

编写器不会被 Client 自动拾取,就像在服务器端(当包扫描时)一样。您需要明确注册它

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

或者您甚至可以使用 WebTarget

进行注册
WebTarget baseTarget = client.target("target");
baseTarget.register(TransactionMessageBodyWriter.class);