我正在使用JBoss-7.1和RESTEasy开发一个简单的RESTFul服务.我有一个名为CustomerService的REST服务,如下所示:
@Path(value="/customers")
@ValidateRequest
class CustomerService
{
@Path(value="/{id}")
@GET
@Produces(MediaType.APPLICATION_XML)
public Customer getCustomer(@PathParam("id") @Min(value=1) Integer id)
{
Customer customer = null;
try {
customer = dao.getCustomer(id);
} catch (Exception e) {
e.printStackTrace();
}
return customer;
}
}
Run Code Online (Sandbox Code Playgroud)
当我点击URL http:// localhost:8080/SomeApp/customers/-1时, @ MIN约束将失败并在屏幕上显示堆栈跟踪.
有没有办法捕获这些验证错误,以便我可以准备一个带有正确错误消息的xml响应并显示给用户?
我希望能够在我的localhost Camel实例上执行HTTP请求(仅用于开发目的,我知道这是不好的做法).现在,我坚持:
Origin http://localhost:8000 is not allowed by Access-Control-Allow-Origin.
Run Code Online (Sandbox Code Playgroud)
我搜索了如何告诉Camel允许这样的请求,但没有找到答案.我正在使用camel-cxf和rsServer来创建我的端点.
我有一个端点看起来像这样:
public class LoginEndpoint {
@GET
@Path(LOGIN)
@Produces(MediaType.APPLICATION_JSON)
public Customer login(@QueryParam("email") String email, @QueryParam("password") String password) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
比标准路线正在做这项工作.
我如何告诉Camel(或JAX-RS或CXFRS组件,我不知道......)允许跨域请求?
我是JAX-RS的新手并且还在学习它,所以我的问题可能有点幼稚,所以请耐心等待:)
我一直在经历各种SO问题"http响应的错误代码".我发现只要一个人不想迂腐,他就可以在回复中返回4xx状态代码.
我想知道是否有任何一般做法可以返回标准HTTP响应状态代码以外的自定义错误代码.
例如,如果在post请求中通过userid获取用户信息,则返回错误,如果userid无效/不存在.在这种情况下,HTTP状态422听起来空闲.但是如果需要详细的错误描述,可以自定义错误,如40xx,其中xx是除了http错误之外的值,返回给客户端.
同样可以定义和返回40xx以响应客户端吗?(在请求中具有正确的语法)
4001 - userid无效
4002 - 帖子ID无效
等等..
或者我应该返回4xx状态代码并在响应正文中添加自己的代码以获取更多错误详细信息?
我是JAX RS和Jersey 2的新手.我的简单休息资源服务器端程序"Hello World"工作正常,我可以通过google chrome的任何浏览器和Advance Rest Client应用程序访问它.
但是当我写了一个JAX RS Jersey 2客户端时,它给了我HTTP 404 Not found,下面是详细信息:
下面是rest资源服务器端程序:
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id ="WebApp_ID"version ="3.0"> ProJrsRi_HelloRest2
<servlet>
<servlet-name>jersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>jersey</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
package com;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
@Path("hello")
public class HelloRest {
@GET()
public String sayHello(){
return "Welcome to the world of REST";
}
}
Run Code Online (Sandbox Code Playgroud)
asm-3.1.jar
jackson-core-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
jersey-client-1.18.jar
jersey-core-1.18.jar
jersey-json-1.18.jar
jersey-server-1.18.jar
jersey-servlet-1.18.jar
jettison-1.1.jar
Run Code Online (Sandbox Code Playgroud)
它在浏览器中工作正常.
package userCoreJava;
import java.net.URI;
import java.net.URISyntaxException;
import javax.ws.rs.client.Client;
import …Run Code Online (Sandbox Code Playgroud) "无效"是指不期望的参数.
例如:
@Path("/")
public interface ExampleInterface {
@GET
@Path("/example")
public Response test(
@QueryParam("param1") String param1,
@QueryParam("param2") String param2
);
}
Run Code Online (Sandbox Code Playgroud)
然后我打电话 ".../example?param3=foo"
我不知道如何用CXF 3.0.4 JAX-RS 2.0客户端以编程方式禁用CN检查.我的代码如下:
System.setProperty("jsse.enableSNIExtension", "false");
HttpsURLConnection.setDefaultHostnameVerifier(
new HostnameVerifier(){
public boolean verify(String hostname,
SSLSession sslSession) {
return true;
}
});
Client client = ClientBuilderImpl.newClient();
String urlHost = "https://" + centralNode;
WebTarget target = client.target(urlHost).path(BASE_SERVICE_URL);
String encodedpw = Base64.encodeBase64String(passwd.getBytes());
String body = "{\"uid\" : \"" + uid + "\",\"password\": \"" + encodedpw + "\"}";
Response res = target.request(MediaType.APPLICATION_JSON).post(Entity.entity(body, MediaType.APPLICATION_JSON)); Run Code Online (Sandbox Code Playgroud)
如您所见,我已经尝试覆盖默认的hostnameverifier,并将jsse.enableSNIExtension设置为false.这些都不起作用,我仍然得到例外:
"https URL主机名与客户端信任库中服务器证书上的公用名(CN)不匹配.确保服务器证书正确,或禁用此检查(不建议用于生产)设置CXF客户端TLS配置属性"disableCNCheck "为了真实."
请帮忙!
请注意:尽管这个问题特别提到了Dropwizard,但我相信任何具有Jersey / JAX-RS经验的人都应该能够回答这个问题,因为我认为Dropwizard只是遵循了Jersey / JAX-RS的惯例。
我有一个Dropwizard服务,该服务以JSON 进行改写 /编写,并且效果很好。
我现在想将其切换为读/写二进制数据(以最小化网络带宽)。我看到有Dropwizard-Protobuf库,但是我对在Dropwizard中实现二进制序列化有一些担忧。
首先,这是我当前(以JSON为中心)代码中的重要内容:
// Groovy pseudo-code
// Domain entity/POJO
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
class Fizz {
@JsonProperty
String name
@JsonProperty
boolean isBuzz
}
// The Dropwizard app entry point
class FizzService extends Application<FizzConfiguration> {
@Override
void run(FizzConfiguration fizzCfg, Environment env) throws Exception {
// ... lots of stuff
env.jersey().register(new FizzService())
}
}
// JAX-RS resource with a sample GET endpoint
@Path(value = "/fizz")
@Produces(MediaType.APPLICATION_JSON)
class …Run Code Online (Sandbox Code Playgroud) jax-rs jersey protocol-buffers binary-serialization dropwizard
我正在尝试匹配字符串v1和v2.为此,我正在尝试以下正则表达式:( ^v(1|2)我也尝试过,$这可能是我需要的).当我在http://www.regextester.com/上测试它时,似乎工作正常.但是当我在JAX-RS路径表达式中使用它时,它不起作用.我使用的表达式如下:
@Path("/blah/{ver:^v(1|2)}/ep")
JAX-RS是否有任何我特有的缺失?
以下两个链接似乎相互矛盾.我很快就会信任这些文档:
默认情况下,服务器上的请求处理在同步处理模式下有效
它已经是多线程的.
我的问题:
哪个是对的.可以同步和多线程吗?
为什么文档会说以下内容?:
如果已知资源方法执行需要很长时间来计算结果,则应使用服务器端异步处理模型
如果文档是正确的,为什么默认操作是同步的?对于用户体验,默认情况下,所有请求在客户端javascript上都是异步的,因此服务器端的默认操作也应该是异步的.
如果客户端不需要按特定顺序提供请求,那么谁在乎操作的"昂贵".不应该所有操作都只是异步吗?
我正在将Jackson 2与Payara 4一起使用,并且我想在Payara 5中使用Jackson 2。
使用JAX-RS,我还希望避免更改注释等。
在Payara 5中,默认的Jsonb提供程序是Yasson。有禁用它并使用Jackson的想法吗?欢迎所有评论/想法:-)
注意: Yasson非常有趣,但是处理抽象类或接口的序列化/反序列化要比放置Jackson注释复杂得多。我目前的理解是,它需要实现JsonbSerializer / Deserializer,但实际上只能在字段/方法上使用序列化器/反序列化器(对于类开放一个问题,这将非常有帮助)。无论如何,迁移到Yasson意味着将根据需要实现许多序列化器/反序列化器(对于实体以及当然是集合),但是我想这很困难。
jax-rs ×10
java ×5
jersey ×4
rest ×3
cxf ×2
resteasy ×2
apache-camel ×1
asynchronous ×1
certificate ×1
client ×1
cross-domain ×1
cxfrs ×1
dropwizard ×1
filter ×1
jackson2 ×1
jsonb ×1
payara ×1
payara-micro ×1
regex ×1
ssl ×1