我们使用Apache CXF构建了一些REST(jax-rs)Web服务.他们返回JSON响应.
我现在需要修改一些请求参数和响应内容.(基本上我们需要对服务返回的一些数据进行编码/加密;当在后续服务调用中将其用作参数时,解码/解密相同的数据.)
看来我这里至少有4个选项:
我之前使用过Servlet过滤器,并且确切地了解如何修改请求参数和响应体,所以我倾向于这一点.但是,我愿意使用CXF Interceptor或JAX-RS过滤器,如果这是使用CXF时解决此问题的更"正确"的方法.但根据文档,我真的不明白如何做到这一点.例如,我是否使用Message对象的setContent方法来更改JSON响应?在这种情况下,格式参数是什么,只是String.class?
我有像这样的网络服务
@GET
@Produces("application/json")
@Path("{parameter1}/july/{param2},{param3},{param4}/month")
public Month getResult(@PathParam("parameter1") String parameter1, @PathParam("param2") PathSegment param2 , @PathParam("param3") PathSegment param3, @PathParam("param4") PathSegment param4) {
return action.getResult(parameter1, new Integer(param2.getPath()), new Integer(param3.getPath()), new Integer(param3.getPath()));
}
Run Code Online (Sandbox Code Playgroud)
如果我从我的测试类中调用此Web服务,它可以正常工作; 但如果我通过浏览器调用它,我会收到消息,因为找不到该服务.
我通过浏览器使用的网址是
HTTP://本地主机:8080/Web应用程序/服务/座椅/ mylogin /月/ 1,0,0 /月
如果我使用网址作为
HTTP://本地主机:8080/Web应用程序/服务/座椅/ mylogin /飞/ 1/0/0 /月
并相应地更改服务中的路径它工作正常,但要求是使用逗号而不是斜杠.我们有什么方法可以在网址中使用带逗号分隔参数的web服务?
为什么Apache有两种JAX-RS实现?
CXF似乎是一个庞大的捆绑包括jax-ws和jax-rs.Wink似乎更轻巧.那么哪一个更好用?有人体验过一个或两个实现吗?也许其中一个已经过时了?
我知道jax-rs还有其他实现,但我想获得有关这两个的信息.
我按照Jersey 2.0文档(https://jersey.java.net/documentation/latest/user-guide.html#json.moxy),修改了pom.xml,包含了jersey-media-moxy工件,编译和安装.我可以为Produces和Consumes案例获得基本的POJO到JSON映射工作.
但是,当我尝试使用复杂数据类型的某些POJO作为资源返回类型时,我得到了很多状态500内部服务器错误但没有任何服务器日志.这很烦人.有人知道这是一个错误还是我错过了一些配置?
顺便说一下,为了对POJO对象使用Moxy映射,POJO需要有一个空参数构造函数.还有其他要求吗?
我有以下结果类,其对象将作为JSON返回.
public class Result {
public String objectid;
public String dtype;
public String type;
public String name;
public String description;
public Result() {
this.objectid = "";
this.dtype= "";
this.type="";
this.name= "";
this.description = "";
}
public String getObjectid() {
return objectid;
}
public void setObjectid(String s) {
this.objectid = s;
}
public String getDtype() {
return dtype;
}
public void setDtype(String s) {
this.dtype= s;
}
public String getType() {
return type;
}
public void setType(String s) {
this.type = …Run Code Online (Sandbox Code Playgroud) 我们使用Spring rest模板和jackson json提供程序来序列化/反序列化json.从我的服务中,我发送一个linkedHashSet,当我收到它时,它会转换为客户端的HashSet.因此我放松了元素的插入顺序.这是针对Set的jackson json提供程序的默认实现吗?有没有其他方法,所以它可以反序列化到正确的实现?我觉得这会很棘手,但你们会非常感激投入.
谢谢
我在一个应用程序中有两个单独的REST服务.让我们说一个主要的"人"服务和一个辅助"管理"服务.我想要的是在服务器上的不同路径中公开它们.我正在使用JAX-RS,RESTEasy和Spring.
例:
@Path("/people")
public interface PeopleService {
// Stuff
}
@Path("/management")
public interface ManagementService {
// Stuff
}
Run Code Online (Sandbox Code Playgroud)
在web.xml我目前有如下设置:
<listener>
<listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<listener>
<listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/public</param-value>
</context-param>
<servlet>
<servlet-name>Resteasy</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Resteasy</servlet-name>
<url-pattern>/public/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)
在PeopleService和ManagementService实施只是春豆.上面的web.xml配置将它们都暴露在外/public(因此分别具有/public/people和/public/management).
我想要完成的是暴露PeopleServiceon /public,以便完整路径将成为/public/people并暴露ManagementServiceon /internal,以便它的完整路径将成为/internal/management.
不幸的是,我无法更改@Path注释的值.
我该怎么办?
在webservice调用中,我想用这个JSON结构返回我的对象.
{
"date" : "30/06/2014",
"price" : {
"val" : "12.50",
"curr" : "EUR"
}
}
Run Code Online (Sandbox Code Playgroud)
我想将这个JSON代码映射到这个Java结构(使用joda-time和joda-money):
public class MyResponse {
LocalDate date;
Money price;
}
Run Code Online (Sandbox Code Playgroud)
我的网络服务目前看起来像这样:
@javax.ws.rs.POST
@javax.ws.rs.Path("test")
@javax.ws.rs.Produces({MediaType.APPLICATION_JSON})
@javax.ws.rs.Consumes({MediaType.APPLICATION_JSON})
public MyResponse test(MyRequest request) {
MyResponse response = new MyResponse();
response.setDate(LocalDate.now());
response.setMoney(Money.parse("EUR 12.50"));
return response;
}
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:我在哪里注册一个自定义处理程序来格式化我想要的日期以及货币表示?
对于REST服务,Jersey vs Jersey(Stand alone)vs Jersey与Grizzly vs Jersey与Tomcat有什么区别?
我可以在不需要服务器的情况下运行Jersey吗?
我正在考虑从使用JAX RS的Apache CXF RS切换到Spring MVC REST,并看到Spring MVC REST当前处理ETag的方式存在一些问题.也许我不理解正确,或者有更好的方法来实现JAX RS目前正在做的事情?
使用Apache CXF RS,在REST服务内部评估上次修改时间戳和ETag的条件(条件评估实际上非常复杂,请参阅RFC 2616第14.24和14.26节,所以我很高兴这对我来说是完成的).代码看起来像这样:
@GET
@Path("...")
@Produces(MediaType.APPLICATION_JSON)
public Response findBy...(..., @Context Request request) {
... result = ...fetch-result-or-parts-of-it...;
final EntityTag eTag = new EntityTag(computeETagValue(result), true);
ResponseBuilder builder = request.evaluatePreconditions(lastModified, eTag);
if (builder == null) {
// a new response is required, because the ETag or time stamp do not match
// ...potentially fetch full result object now, then:
builder = Response.ok(result);
} else {
// a new response is not needed, …Run Code Online (Sandbox Code Playgroud)