泽西网络服务 returns 204 无内容

Jersey web service returns 204 no content

环境:

描述:

AOP 配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
       ">
    <!-- Aop Bean -->
    <bean id="wsChecker" class="xn.safephone.webapp.aop.AopWebServiceChecker"/>
    <!-- Aop Configuration -->
    <aop:config>
        <aop:aspect id="aopWsChecker" ref="wsChecker">
            <aop:pointcut id="aopWs" expression="execution (* xn.safephone.webapp.webservices.*.*(..))"/>
            <aop:around method="doAround" pointcut-ref="aopWs"/>
        </aop:aspect>
    </aop:config>
</beans>

web.xml

<servlet>
    <servlet-name>REST-Servlet</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>xn.safephone.webapp.webservices</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>REST-Servlet</servlet-name>
    <url-pattern>/ws/*</url-pattern>
</servlet-mapping>

泽西网络服务Class

@GET
@Path("test")
@Produces("text/plain")
public String test() {
    return "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
}

AOPClass

public class AopWebServiceChecker {
    public void doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("1");
        joinPoint.proceed();
        System.out.println("2");
    }
}

结果:

如果我运行使用AOP的web服务,没有错误,但是客户端returns“204 No Content”。如果我禁用 AOP,一切都很好。那为什么?

非常感谢!

问题在于,通过环绕建议,您需要 return 一个值;该值是来自实际建议方法调用的 return 值。原因是 around-advice 允许您在需要时修改 return 值。

目前您正在 returning void,这会影响资源方法调用 returning null。当 returning nul 时,Jersey 的默认行为是只发送一个没有数据的 204 No Content,因为没有数据。

在方法 return 上调用 joinPoint.proceed() 值的结果将是该方法调用的 return 值。因此,只需获取对该值的引用并 return 它。

public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("1");
    Object retValue = joinPoint.proceed();
    System.out.println("2");
    return retValue;
}

另请参阅: