标签: jax-rs

JAX-RS,RestEasy:没有会话cookie

伙计们,

曾经是当你点击servlet/jsp时,app服务器会自动启动一个会话.它会将会话cookie放在第一个动态响应中,并在整个过程中进行跟踪.

我有一个休息后端,我注意到没有会话cookie被交易.所以我手动添加代码来发送JSESSIONID cookie:

@Context 
private HttpServletRequest httpRequest;
// ...
@GET
@Path( "/{rcpGuid}" )
public Response myMethod( ... )
{
    final HttpSession session = httpRequest.getSession();
    final String sSessionId = session.getId();
    ...
    return Response.status( Response.Status.SEE_OTHER ).
        location( redirectUrl ).cookie( new NewCookie( "JSESSIONID", sSessionId ) );
}
Run Code Online (Sandbox Code Playgroud)

现在这导致返回2个JSESSIONID cookie副本,之前没有Set-Cookie标头.这就是我现在在浏览器的检查器中看到的内容:

Set-Cookie:JSESSIONID=sdm-Q1P6pRoQbKd4-9cJylGb; Path=/nn, JSESSIONID=sdm-Q1P6pRoQbKd4-9cJylGb; Version=1
Run Code Online (Sandbox Code Playgroud)

只要这样可行,我就不在乎.但不幸的是,当我的浏览器请求将URL重定向到(注意响应是"SEE_OTHER")时,该请求不具有会话ID.这导致我的应用程序无法正常运行.

任何见解?

jax-rs resteasy jboss7.x

1
推荐指数
1
解决办法
9229
查看次数

什么是Eclipse"动态Web模块"编号,为什么JAX-RS不在项目facet列表中?

我正在尝试使用IBM RAD 7.5.5(基本上是Eclipse +插件)和WebSphere 6.1构建基于JAX-RS的Web服务.

当我创建一个新的Dynamic Web Project时,我得到了"New Dynamic Web Project"对话框.

对于"目标运行时",当我选择"WebSphere 6.1"时,"动态Web模块"是2.4,当我修改配置时,在列表中没有"JAX-RS(REST Web服务)".

但是,对于"目标运行时",当我选择"WebSphere 7.0"时,"动态Web模块"为2.5并修改配置,在列表中选择"JAX-RS(REST Web服务)".

所以我的问题是,为什么在WebSphere 6.1/Dynamic Web Module 2.4的列表中不是"JAX-RS"?它根本不受支持吗?如果有人能解释为什么以及数字"2.4"的含义,我们将不胜感激!

谢谢,罗布

java eclipse jax-rs ibm-rad facets

1
推荐指数
1
解决办法
4446
查看次数

使用JAX-RS和Hibernate实现Spring事务

背景

我正在尝试使用Apache-CXF实现RESTful Web服务,该服务与数据库交互以通过Hibernate执行一些CRUD操作.Web服务使用Jackson JAX-RS Provider消耗和生成JSON格式的对象.

我目前正在收到一个"未能懒得初始化一个集合......没有会话或会话被关闭"的例外情况,当它试图序列化响应对象时,它正在从Jackson提供者那里冒出来.

我假设如果我标记了服务方法,@Transactional那么当序列化响应时,Jackson会提供会话,但事实并非如此.

当Jackson在序列化期间走过对象时,如何让hibernate会话可用?

我试过的

弹簧配置

<context:component-scan base-package="com.db.cif.mapper" />
<context:component-scan base-package="com.db.cif.mapper.repository" />
<context:annotation-config />

<tx:jta-transaction-manager>
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</tx:jta-transaction-manager>

<tx:annotation-driven />

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="cifmapper" />
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>
</bean>

<!-- JAX-RS Configuration -->
<jaxrs:server id="mappingService" address="/">
    <jaxrs:serviceBeans>
        <ref bean="mappingServiceBean" />
    </jaxrs:serviceBeans>
    <jaxrs:extensionMappings>
        <entry key="json" value="application/json" />
    </jaxrs:extensionMappings>
    <jaxrs:providers>
        <ref bean="jsonProvider" />
    </jaxrs:providers>
</jaxrs:server>

<bean id="mappingServiceBean" class="com.db.cif.mapper.MappingService" />

<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider" />
Run Code Online (Sandbox Code Playgroud)

服务Bean

@Service("mappingService")
@Transactional …
Run Code Online (Sandbox Code Playgroud)

spring hibernate cxf jax-rs spring-transactions

1
推荐指数
1
解决办法
1629
查看次数

jaxrs配置多个jaxrs:具有不同bean的服务器标签

此问题与JAX-RS配置有关.

我为单个类配置了JAX-RS.配置工作正常.

@Path(/bean1/)
@Produces("application/xml")
public class class1 {
    @POST
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    @Path(/m1)
    public String method1(JAXBElement<String> request) {
    }

    @POST
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    @Path(/m2)
    public String method2(JAXBElement<String> request) {
    }
}
Run Code Online (Sandbox Code Playgroud)

下面是jaxrs:服务器标签

<jaxrs:server id="bean1" address="/">
    <jaxrs:serviceBeans>
    <ref bean="class1" />
    </jaxrs:serviceBeans>
    <jaxrs:extensionMappings>
    <entry key="xml" value="application/xml" />
    </jaxrs:extensionMappings>
</jaxrs:server>
Run Code Online (Sandbox Code Playgroud)

我可以通过URL"/ bean1/m1"通过Apache Jersey客户端调用


现在,我想用JAX-RS配置另一个类.因此,我添加了如下配置

@Path(/bean2/)
@Produces("application/xml")
public class class2 {
    @POST
    @Consumes(MediaType.APPLICATION_XML)
    @Produces(MediaType.APPLICATION_XML)
    @Path(/m3)
    public String method3(JAXBElement<String> request) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我添加了另一个jaxrs:服务器标签和指定的地址.有效的配置是

<jaxrs:server id="bean1" address="/bean1">
    <jaxrs:serviceBeans>
    <ref bean="class1" />
    </jaxrs:serviceBeans>
    <jaxrs:extensionMappings>
    <entry key="xml" value="application/xml" /> …
Run Code Online (Sandbox Code Playgroud)

jax-rs

1
推荐指数
1
解决办法
7946
查看次数

如何在JAX-RS中处理意外异常

我的技术堆栈是Tomcat(servlet 3.0),Jersey用于JAX-RS,Spring和Hibernate.当Hibernate中的某些数据转换错误出现意外问题时,我不希望客户端看到我的堆栈跟踪是否存在Tomcat尝试默认打印的异常.但是我想记录这些异常,这样我就可以找到错误并解决问题.

我的第一次尝试是使用来自JAX-RS的ExceptionMapper并且天真地认为可以解决我的问题.但后来我发现泽西岛抛出了自己的例外,例如未映射的网址是com.sun.jersey.api.NotFoundExceptions.这会导致记录404异常,这是我不想要的.更糟糕的是,客户端不再获得404而是获得状态代码500.

我可以为jersey抛出的异常创建异常映射器,但我可能会错过一些东西.这样的事情有最好的做法吗?

java spring servlets jax-rs jersey

1
推荐指数
1
解决办法
2737
查看次数

如何将RESTeasy中的编码设置为UTF-8?

我在RESTeasy中编码字符串时遇到问题.问题是中文字母或任何其他非拉丁字符无法正确显示.如果我尝试将它们打印出来(或作为回复发送),我会得到"?????" 代替.我相信RESTeasy中的默认编码是us-ascii.你知道怎么把它换成UTF-8吗?也许还有另一个解决这个问题的方法?

这是我的代码中的一段短文:

@POST
@Path("post")
@Consumes(MediaType.MULTIPART_FORM_DATA)
public String uploadData(@MultipartForm DataUploadForm uploadForm) {

...

//the code below is just for the purpose of presentation

String text = "some non-latin alphabet signs here"
System.out.println(text);  // "??????" is printed out

return text; //"??????" is returned
}
Run Code Online (Sandbox Code Playgroud)

我的resteasy-jaxrs-3.0-beta-2在Tomcat 7.0上运行.

谢谢!

tomcat servlets jax-rs resteasy

1
推荐指数
1
解决办法
1万
查看次数

从类加载器中看不到HttpServletRequest

我正在尝试在OSGI中运行Apache Wink并使用Felix Whiteboard注册资源作为服务.在极简主义的OSGI环境中,捆绑包按预期工作.但是,然后我将捆绑包移动到Eclipse Equinox环境中,我正在开发一个依赖它的插件.我开始收到这个错误.

May 22, 2013 11:19:59 AM org.apache.wink.server.internal.application.ApplicationProcessor processWinkApplication
SEVERE: An exception occurred during processing of the com.yarcdata.rest.Repositories instance. This instance is ignored.
 java.lang.IllegalArgumentException: interface javax.servlet.http.HttpServletRequest is not visible from class loader
at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:461)
at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:690)
at org.apache.wink.common.internal.registry.ContextAccessor.getContextFromAccessor(ContextAccessor.java:92)
Run Code Online (Sandbox Code Playgroud)

我想我已经安装了所有必需的软件包,如果我开始寻找导出HttpServletRequest的软件包,我会看到:

g! lb | grep ervlet
311|Resolved   |    4|Servlet API Bundle (3.0.0.v201112011016)
394|Starting   |    4|Http Services Servlet (1.1.300.v20120912-130548)
444|Resolved   |    4|Jetty :: Servlet Handling (8.1.3.v20120522)
578|Resolved   |    4|jersey-servlet (1.12.0)
580|Resolved   |    4|jersey-servlet (1.17.1)
588|Active     |    4|Java Servlet API (3.0.1)
589|Resolved …
Run Code Online (Sandbox Code Playgroud)

osgi eclipse-plugin jax-rs apache-wink amdatu

1
推荐指数
1
解决办法
1606
查看次数

JAX-RS Jersey:@XmlElementWrapper返回

我正在尝试根据泽西/ Jaxb对豆类列表的别名接受的答案,在Artcile的评论列表周围添加一个包装类

public class Article implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    ...
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "ARTICLE_COMMENT",
    joinColumns =
    {
        @JoinColumn(name = "ARTICLE_ID", referencedColumnName = "ID")
    },
    inverseJoinColumns =
    {
        @JoinColumn(name = "COMMENT_ID", referencedColumnName = "ID")
    })
    @XmlElementWrapper(name = "user_comments")
    private List<Comment> comments;

    public Article()
    {
    }
 ...
 }
Run Code Online (Sandbox Code Playgroud)

评论是

@XmlRootElement
@Entity
public class Comment implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;

    /*
    @ManyToMany(cascade={CascadeType.ALL},fetch=FetchType.EAGER)
    private Collection<Article> articles; …
Run Code Online (Sandbox Code Playgroud)

jax-rs jersey java-ee

1
推荐指数
1
解决办法
2009
查看次数

在JAX-RS响应中使用ISO-8601日期

我正在使用GlassFish 4上的Java EE 7构建RESTful Web服务.在序列化包含java.util.Date对象的POJO 时,不包括时区信息.

如何自定义对象序列化以便java.util.Date包含时区信息?

例如,而不是这样:

{
  "id": 1234,
  "foo": "2014-05-19T13:53:49.392"
}
Run Code Online (Sandbox Code Playgroud)

我反而喜欢这样:

{
  "id": 1234,
  "foo": "2014-05-19T13:53:49.392+09:30"
}
Run Code Online (Sandbox Code Playgroud)

服务器的时区是GMT + 09:30.

java json glassfish jax-rs iso8601

1
推荐指数
1
解决办法
6870
查看次数

RESTEasy支持JAX-RS @RolesAllowed

我花了几个小时在嵌入式Jetty 9.1.0.v20131115和RESTEasy 3.0.5.Final中安装自定义登录服务.我的登录服务将在数据库中查找用户并为其分配角色.它看起来像这样:

final Constraint restConstraint = new Constraint();
restConstraint.setName(Constraint.__BASIC_AUTH);
restConstraint.setRoles(new String[]{"user", "admin");
restConstraint.setAuthenticate(true);
final ConstraintMapping restConstraintMapping = new ConstraintMapping();
restConstraintMapping.setConstraint(restConstraint);
restConstraintMapping.setPathSpec("/api/*");
final ConstraintSecurityHandler restSecurityHandler = new ConstraintSecurityHandler();
final LoginService myLoginService = new MyLoginService();
restSecurityHandler.setAuthenticator(new BasicAuthenticator());
restSecurityHandler.setRealmName(myLoginService.getName());
restSecurityHandler.addConstraintMapping(restConstraintMapping);
restSecurityHandler.setLoginService(myLoginService);
Run Code Online (Sandbox Code Playgroud)

我有用户joe-user谁拥有的角色user,和jane-admin谁既有useradmin角色.我有一个GET名为的REST 资源my-resource:

@RolesAllowed("admin")
Run Code Online (Sandbox Code Playgroud)

当我做一个HTTP GETmy-resource的浏览器中正确请求凭据,我可以登录,无论是joe-userjane-admin.问题是任何一个用户都被允许GET my-resource!!

我已经跟踪了一些Jetty代码,事实上,由于我的登录服务,Jetty要求登录用户支持哪些角色.不幸的是,无论用户如何,Jetty都会接受我指定的任何角色restConstraint.setRoles(new String[]{"user", "admin").

显然,RESTEasy层应该识别@RolesAllowed("admin")注释并验证用户.但是我如何让RESTEasy做到这一点?

jax-rs embedded-jetty resteasy

1
推荐指数
1
解决办法
2857
查看次数