我正在使用带有jackson提供程序的RestEasy客户端并收到上述错误
客户端代码是:
ClientRequest request = new ClientRequest(url);
request.accept(MediaType.APPLICATION_JSON);
ClientResponse<String> response = request.get(String.class);
if (response.getStatus() != 200) {
throw new RuntimeException("Failed : HTTP error code : " + response.getStatus());
}
BufferedReader br =
new BufferedReader(new InputStreamReader(new ByteArrayInputStream(response.getEntity().getBytes())));
Run Code Online (Sandbox Code Playgroud)
response.getEntity()正在抛出ClientResponseFailure异常,错误是
Unable to find a MessageBodyReader of content-type application/json and type class java.lang.String
Run Code Online (Sandbox Code Playgroud)
我的服务器端代码如下:
@GET
@Path("/{itemId}")
@Produces(MediaType.APPLICATION_JSON)
public String item(@PathParam("itemId") String itemId) {
//custom code
return gson.toJSON(object);
}
Run Code Online (Sandbox Code Playgroud) 我正在开发一个web应用程序,包括UI-Angular,Server-Java,RestEasy 3.0.9.Final for rest api calls
当我试图从另一个域访问其余服务时,我得到以下错误
无法加载对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" http:// localhost:8080 "访问.
我配置我的服务器端以响应跨域调用,这是使用GET调用但POST调用正在创建ERROR
web.xml中
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.test.sample.app.CorsFeature</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.test.sample.app.Application</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
服务类
@GET
@Path("/getnameAtt")
@Produces(MediaType.APPLICATION_JSON)
public Response getHostnameAttributes() {
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(new TestImpl().getHostNameAttributes())
.build();
}
@POST
@Path("/getSeq") …Run Code Online (Sandbox Code Playgroud) 是否有一种简单的,而不是使用弹簧的方式让RESTeasy返回带有模型的jsp或html页面?我想做一些类似于Spring的ModelAndView,我有一个请求说/ contacts/loomer并让它在jsp模板中返回一个模拟对象.我看到的所有示例都是针对JSON/XML的.我知道在Jersey你可以使用可查看的,但我只需要使用RESTeasy的东西.
谢谢!
我想要这样的东西(但没有春季模式视图):
@POST
@PUT
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.TEXT_HTML)
public ModelAndView saveContactForm(@Form Contact contact)
throws URISyntaxException
{
service.save(contact);
return viewAll();
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用JBoss AS 7.1的JAX-RS应用程序,以及包含Dates(java.util.Date)的POST/GET JSON和XML对象:
@XmlRootElement
@XmlAccessorType(XmlAccessField.FIELD)
public class MyObject implements Serializable
{
@XmlSchemaType(name = "dateTime")
private Date date;
...
}
Run Code Online (Sandbox Code Playgroud)
当我在get方法上使用@Produce("application/xml")时,objets被序列化为XML并且日期被转换为ISO-8601字符串(例如"2012-12-10T14:50:12.123 + 02:00") ).
但是,如果我在get方法上使用@Produce("application/json"),则JSON对象中的日期是时间戳(例如"1355147452530")而不是ISO-8601字符串.
如何配置JAX-RS实现(RESTEasy)以JSON格式将日期序列化为ISO-8601字符串而不是时间戳?
谢谢您的回答.
注意:我还尝试使用自定义JAX-RS提供程序为日期执行JSON序列化
@Provider
@Produces(MediaType.APPLICATION_JSON)
public class CustomJsonDateProvider implements MessageBodyWriter<Date>
{
...
}
Run Code Online (Sandbox Code Playgroud)
这个提供程序似乎是由RESTeasy在JBoss初创公司注册的:
[org.jboss.jaxrs] Adding JAX-RS provider classes: package.CustomJsonDateProvider
...
[org.jboss.resteasy.cdi.CdiInjectorFactory] No CDI beans found for class package.CustomJsonDateProvider. Using default ConstructorInjector.
Run Code Online (Sandbox Code Playgroud)
但它永远不会被使用!
我正在尝试构建一个REST Web服务(服务器端),它允许合作伙伴系统以JSON格式连接/ POST订单信息.我应该使用JAX RS(例如来自JBOSS RESTEasy)还是使用Spring MVC来构建这样的服务?就构建REST服务而言,它们似乎都有足够的能力完成同样的事情.
谢谢!
在将文件作为对REST请求的响应返回后,处理删除文件的最佳方法是什么?
我有一个端点,根据请求创建一个文件并在响应中返回它.一旦调度响应,就不再需要该文件,可以/应该删除该文件.
@Path("file")
@GET
@Produces({MediaType.APPLICATION_OCTET_STREAM})
@Override
public Response getFile() {
// Create the file
...
// Get the file as a steam for the entity
File file = new File("the_new_file");
ResponseBuilder response = Response.ok((Object) file);
response.header("Content-Disposition", "attachment; filename=\"the_new_file\"");
return response.build();
// Obviously I can't do this but at this point I need to delete the file!
}
Run Code Online (Sandbox Code Playgroud)
我想我可以创建一个tmp文件,但我认为有一个更优雅的机制来实现这一目标.该文件可能非常大,因此我无法将其加载到内存中.
我正在搞乱JAX-RS并创建了一个调用生成JSON的REST服务的应用程序.我试过Jersey,一切都很顺利,但我不得不切换到RESTEasy,因为我的应用程序需要用JDK5构建.我将web.xml更改为以下内容:
<web-app>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap
</listener-class>
</listener>
<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>/rest/*</url-pattern>
</servlet-mapping>
<!-- ... -->
</web-app>
Run Code Online (Sandbox Code Playgroud)
所以我希望每个以/ rest开头的URL都由RESTEasy处理.我的服务如下:
@Path("/services")
public class MyRESTServices {
@GET
@Path("service1")
@Produces(MediaType.APPLICATION_JSON)
public Object service1(Blah blah) {
}
}
Run Code Online (Sandbox Code Playgroud)
使用Jersey工作正常,http:// localhost/MyContext/rest/services/service1绑定到我的service1()方法.但是,当我改为RESTEasy时,我有一个404:
HTTP状态404 - 无法找到相对的资源:/ rest/services/service1 of full path:http:// localhost/MyContext/rest/services/service1
这意味着RESTEasy处理了请求但找不到绑定到此URL的任何服务.
然而,在我的课堂上,@Path("/services")改为@Path("/rest/services")工作.你知道我为什么会有这种奇怪的行为吗?我读过的所有教程/文档都只提到相对路径,不包括/ rest前缀...
对不起这个生硬的问题.但是很多人日复一日地使用这两个术语但我不知道.我做了一些关于这个的研究并且知道它是分开的.但不明白它是如何相关的.我将首先分享我对这两个的理解.
JAXB是XML-to-Java绑定技术,支持模式和Java对象之间以及XML实例文档和Java对象实例之间的转换.在内部,JAXB在xml和java之间进行所有这些转换.这是xml的解析器,然后它知道xml中的哪个组件对应于java中的内容并且它会中断.从JAXB转换此答案是通过xjc(或codgen插件)等工具完成的.映射可能就像
xsd:string java.lang.String
xsd:integer java.math.BigInteger
JaxRs与众不同.这是处理请求的一组规范.意思是它说"GET("/ foo")"意味着用url/foo处理一个get调用.它只说明了这一点.怎么做的?是的,这称为此规范的实现.有许多实现,如restlet,resteasy,jersey,apache cxf等.这类似于逻辑和你在数学中实现的方式.算法的想法是桶搜索.这可以以任何方式实现.在Java术语中,JaxRs是接口,这4个restlet,resteasy,jersey,apache cxf是接口的实现.
现在请说出我的理解是否正确.然后告诉他们如何相关.请帮忙 .如果可能,图片说明将更有帮助.
使用JSON正文返回的REST服务的POST操作
org.jboss.resteasy.spi.UnsupportedMediaTypeException
:不能消耗内容类型异常
两者@Consumes(MediaType.APPLICATION_JSON)并@Consumes("application/json")返回相同的异常.
我尝试使用Postman API客户端调用该服务.

@RolesAllowed("admin")
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Path("/auth")
public Response login(UserCl usr){
if(usr.getUsername().compareTo("user") == 0 &&
usr.getPassword().compareTo("pass") == 0){
return Response.status(200).build();
}
else{
return Response.status(401).build();
}
}
12:44:07,322 WARN [org.jboss.resteasy.core.SynchronousDispatcher] (http-localhost-127.0.0.1-8080-1) Failed executing POST user-service/auth: org.jboss.resteasy.spi.UnsupportedMediaTypeException: Cannot consume content type
at org.jboss.resteasy.core.registry.Segment.match(Segment.java:117) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.registry.SimpleSegment.matchSimple(SimpleSegment.java:33) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:327) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.registry.SimpleSegment.matchSimple(SimpleSegment.java:44) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.registry.RootSegment.matchChildren(RootSegment.java:327) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:374) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.registry.RootSegment.matchRoot(RootSegment.java:367) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.ResourceMethodRegistry.getResourceInvoker(ResourceMethodRegistry.java:307) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.getInvoker(SynchronousDispatcher.java:173) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:118) [resteasy-jaxrs-2.3.2.Final.jar:]
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:208) [resteasy-jaxrs-2.3.2.Final.jar:]
at …Run Code Online (Sandbox Code Playgroud)