Предполагая, что ваша реализация состоит из аннотаций, как этот
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.ws.rs.HttpMethod;
@HttpMethod("PATCH")
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PATCH {}
Попытка сделать что-то подобное с Client
String response = target.request().method("PATCH", Entity.text("Hello"), String.class);
по умолчанию не поддерживается, и будет исключение, как
java.net.ProtocolException: Invalid HTTP method: PATCH
Это не представляет проблемы с Client
API напрямую, но с Java-интерфейсами более низкого уровня. Кажется, это ограничение безопасности.
С Client API можно переопределить, задав свойство
В JerseyTest
, один из способов настроить Client
это переопределить configureClient
и установить свойство с ClientConfig
. Вы можете так же легко установить свойство на самом Client
, но оставаясь в духе JerseyTest
рамок (где мы не должны явно получить доступ к Client
, в приведенном ниже примере будет только просто переопределить метод
public class PatchTest extends JerseyTest {
@Path("patch")
public static class PatchResource {
@PATCH
@Produces(MediaType.TEXT_PLAIN)
public String getPatch(String request) {
return "Patched " + request;
}
}
@Override
protected void configureClient(final ClientConfig config) {
config.property(HttpUrlConnectorProvider.SET_METHOD_WORKAROUND, true);
}
@Override
public Application configure() {
return new ResourceConfig(PatchResource.class);
}
@Test
public void doPatchTest() {
WebTarget target = target("patch");
String response = target.request().method("PATCH", Entity.text("Hello"), String.class);
Assert.assertEquals("Patched Hello", response);
System.out.println(response);
}
}