JAX-RS方法没有Path或HTTP方法注释

时间:2015-10-08 18:51:33

标签: java spring web-services

我使用Spring和Apache CXF实现现有接口的另一个实现。当tomcat启动时,它会显示以下错误消息:

  

ModuleInterface中的方法getSomething没有JAX-RS路径或HTTP   方法注释

并且,两个端点都返回404。

我不确定我错过了什么。任何人都不知道吗?

@Configuration
@ImportResource({"classpath:/META-INF/cxf/cxf-servlet.xml", "classpath:/META-INF/cxf/cxf.xml"})
public class APIConfig {
@Autowired @Lazy ModuleInterface moduleInterface;

@Bean
public Server initCxfServer(){
    JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
    sf.setServiceBeanObjects(getJaxRsResources());
    sf.setProviders(Arrays.asList(
            new JacksonJaxbJsonProvider()
    ));

    return sf.create();
}

private Object[] getJaxRsResources() {
    return new Object[]{
        moduleInterface
    };
}

private HashMap getExtMaps() {
    return new HashMap<String,String>(){{
        put("json","application/json;charset=utf-8");
        put("xml","application/xml;charset=utf-8");
        put("wadl","application/vnd.sun.wadl+xml");
        put("desc","application/vnd.sun.desc+json;charset=utf-8");
       }};
}

-

ldapsearch

-

./ldapsearch -p 1545 -Z -X -D "cn=Directory Manager" -w passwd -b "o=platform" "(objectClass=*)" | grep -i secret

-

html, body{height:100%; margin:0;padding:0}
 
.container-fluid{
  height:100%;
  display:table;
  width: 100%;
  padding: 0;
}
 
.row-fluid {height: 100%; display:table-cell; vertical-align: middle;}
 
 

.centering {
  float:none;
  margin:0 auto;
    background: #abc;
    height: 25px; 
}

5 个答案:

答案 0 :(得分:1)

如果您在接口和实现类中使用@Valid(或者甚至是@Context之类的其他注释)来声明两个方法中的参数,则可能会发生这种情况。

仅将注释保留在使用@Path注释的方法的参数上(无论是在接口中,还是在实现类中),它应该可以正常工作。

答案 1 :(得分:0)

您需要让CXF了解您的服务和/或配置CXF。

请参阅:http://cxf.apache.org/docs/jaxrs-services-configuration.html#JAXRSServicesConfiguration-ConfiguringJAX-RSservicesincontainerwithSpringconfigurationfile了解使用Spring的CXF JAX-RS配置。

修改

如果你有多个实例,你希望哪一个实例加载下一行?

@Autowired @Lazy ModuleInterface moduleInterface;

阵列不应该达到你想要的效果吗?喜欢:

@Autowired @Lazy ModuleInterface[] moduleInterfaces;

答案 2 :(得分:0)

扫描您的课程以了解可以接收请求的方法(Resource methods)。 getSomething是候选者,因为它具有参数注释@Valid,但它不符合资源方法,因为它缺少JAX-RS路径或HTTP方法注释。

例如,添加@GET注释将执行此操作(如果您希望通过此方法接收HTTP GET请求)。

public interface ModuleInterface {
    @GET
    public Response getSomething(@Valid RequestObj obj);
}

答案 3 :(得分:0)

我有同样的警告。在我的情况下,我使用了CXF 3.1.3,我错过了在karaf中添加弹簧功能。

有关详细信息,请参阅Migration Guide至CXF 3.1.x

答案 4 :(得分:0)

添加bean的名称并使用限定符注释

@Service("foo")
@Path("/foo")
public class FooClass implements ModuleInterface {
public Response getSomething(@Valid Request obj){
// code
}
}
--

@Service("foov2")
@Path("/new/foo")
public class FooV2Class implements moduleInterface {
public Response getSomething(@Valid Request obj){
// code
}
}

@Component
public class Service {
@Autowired
@Qualifier("foo")
ModuleInterface moduleInterface
}