伙计们,
曾经是当你点击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.这导致我的应用程序无法正常运行.
任何见解?
我正在尝试使用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"的含义,我们将不胜感激!
谢谢,罗布
我正在尝试使用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)
@Service("mappingService")
@Transactional …Run Code Online (Sandbox Code Playgroud) 此问题与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) 我的技术堆栈是Tomcat(servlet 3.0),Jersey用于JAX-RS,Spring和Hibernate.当Hibernate中的某些数据转换错误出现意外问题时,我不希望客户端看到我的堆栈跟踪是否存在Tomcat尝试默认打印的异常.但是我想记录这些异常,这样我就可以找到错误并解决问题.
我的第一次尝试是使用来自JAX-RS的ExceptionMapper并且天真地认为可以解决我的问题.但后来我发现泽西岛抛出了自己的例外,例如未映射的网址是com.sun.jersey.api.NotFoundExceptions.这会导致记录404异常,这是我不想要的.更糟糕的是,客户端不再获得404而是获得状态代码500.
我可以为jersey抛出的异常创建异常映射器,但我可能会错过一些东西.这样的事情有最好的做法吗?
我在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上运行.
谢谢!
我正在尝试在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) 我正在尝试根据泽西/ 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) 我正在使用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.
我花了几个小时在嵌入式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谁既有user和admin角色.我有一个GET名为的REST 资源my-resource:
@RolesAllowed("admin")
Run Code Online (Sandbox Code Playgroud)
当我做一个HTTP GET上my-resource的浏览器中正确请求凭据,我可以登录,无论是joe-user或jane-admin.问题是任何一个用户都被允许GET my-resource!!
我已经跟踪了一些Jetty代码,事实上,由于我的登录服务,Jetty要求登录用户支持哪些角色.不幸的是,无论用户如何,Jetty都会接受我指定的任何角色restConstraint.setRoles(new String[]{"user", "admin").
显然,RESTEasy层应该识别@RolesAllowed("admin")注释并验证用户.但是我如何让RESTEasy做到这一点?