3

アプリケーションの構成方法について壁にぶつかっています。目標は、同じ Tomcat サーバー上で以下を実行できるようにすることです。

  • 完全な安らかなサービス (つまり、ハイパーメディア レイヤー、したがって application/hal+json 形式を返す)
  • 昔ながらの方法でのレスト サービス サービス (コントローラー アクセス)
  • Web ページ配信用の従来のコントローラー セット

環境は次のとおりです。

<spring-framework.version>4.0.1.RELEASE</spring-framework.version>
<spring-framework.version>4.0.1.RELEASE</spring-framework.version>
<spring-test.version>4.0.1.RELEASE</spring-test.version>
<spring-data-rest-webmvc.version>2.0.0.RC1</spring-data-rest-webmvc.version>
<spring-data-jpa.version>1.4.3.RELEASE</spring-data-jpa.version>
<spring-data-commons.version>1.7.0.RC1</spring-data-commons.version>

リポジトリ:

@RepositoryRestResource( path = "u")
public interface IUserRepository extends CrudRepository<Users, Long> {
     Users findByName(@Param("name") String name);
}

残りのコントローラー:

@RestController
@RequestMapping (value = "/users", produces=MediaType.APPLICATION_JSON_VALUE)
public class RestUserController {
    @Autowired
    private IService service;

    @RequestMapping (method = RequestMethod.GET)
    public @ResponseBody Iterable<DomainModel.User> findAllUsers() {
         return service.findAllUsers();
    }
}

「ウェブ」コントローラー:

@Controller
@RequestMapping (value = "/web")
public class HomeController {
@RequestMapping(method = RequestMethod.GET, value = "/home")
public String displayHome(Model model) {
    return "home"
}

JPA構成(簡単にするために、jpaデータソースの宣言を入れました...)

@Configuration
@PropertySource({ "classpath:persistence-mysql.properties" })
@ComponentScan(basePackages = { "com.xxx.controller.rest", com.xxx.services.rest.impl" })
@EnableJpaRepositories(basePackages = "com.xxx.persistence.repository")
@EnableTransactionManagement
public class ConfigForJpa {
...
}

WebMvc の構成:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.xxx.controller.web" })
public class ConfigForWebMvc extends WebMvcConfigurerAdapter {
    private static final String VIEW_RESOLVER_PREFIX = "/WEB-INF/views";
    private static final String VIEW_RESOLVER_SUFFIX = ".jsp";
...
@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setViewClass(JstlView.class);
    viewResolver.setPrefix(VIEW_RESOLVER_PREFIX);
    viewResolver.setSuffix(VIEW_RESOLVER_SUFFIX);
    return viewResolver;
}
...

}

リポジトリの構成:

@Configuration
@ComponentScan(basePackages = { "com.xxx.controller.rest" })
public class ConfigForRepositoryRestMvc extends RepositoryRestMvcConfiguration {
}

初期化設定:

public class WebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
    return new Class<?>[] { ConfigForJpa.class };
}

@Override
protected Class<?>[] getServletConfigClasses() {
    return new Class<?>[] { ConfigForWebMvc.class,
            ConfigForRepositoryRestMvc.class };
}

@Override
protected String getServletName() {
    return " ServletName";
}

@Override
protected String[] getServletMappings() {
    return new String[] { "/" };
}
}

Web ルート コンテキストが「sr」に設定されていることに注意してください。

Tomcat サーバーが起動すると、マッピングが行われていることがはっきりとわかります。

RequestMappingHandlerMapping - Mapped "{[/web/home],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public java.lang.String com.xxx.controller.web.HomeController.displayHome
RequestMappingHandlerMapping - Mapped "{[/users/user],methods=[POST],params=[],headers=[],consumes=[],produces=[application/json],custom=[]}" onto public com.xxx.model.DomainModel$User com.xxx.controller.rest.RestUserController
...
SimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
...
RepositoryRestHandlerMapping - Mapped "{[/{repository}],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.hateoas.Resources
RepositoryRestHandlerMapping - Mapped "{[/],methods=[GET],params=[],headers=[],consumes=[],produces=[],custom=[]}" onto public org.springframework.data.rest.webmvc.RepositoryLinksResource org.springframework.data.rest.webmvc.RepositoryController.listRepositories()

いいもの:

  • xlocalhostx:8080/sr (sr はルート Web コンテキスト) でサーバーにアクセスすると、次のようにハイパーメディア方式で安静サービスのリストを取得します。

    { "_links" : { "userss" : { "href" : " http://xlocalhostx:8080/sr/u" } } }

  • サーバーにxlocalhostx:8080/sr/usersアクセスすると、期待どおりに次のようになります。

[{"id":1,"name":"Clark","lastname":"Kent"},{"id":2,"name":"Lois","lastname":"Lane"}]

次のテストを実行すると、合格します。

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes = { ConfigForWebMvc.class, ConfigForRepositoryRestMvc.class} )
public class HomeControllerTest {
@Autowired
private WebApplicationContext wac;

private MockMvc mockMvc;

@Before
public void setup() {
    this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
    }

@Test
public void getHome() throws Exception {
    this.mockMvc.perform(get("/web/home"))
        .andDo(print())
        .andExpect(status().isOk())
        .andExpect(forwardedUrl("/WEB-INF/views/home.jsp"));
}
}

悪い 点 - xlocalhostx:8080/sr/ web/homeでサーバーにアクセスすると、ビュー解決プロセスが間違ったパスを使用してビューを返そうとしているため、404 が返されます。(私の home.jsp はもちろん、ビュー フォルダーの下の WEB-INF フォルダーの下にあります。ログ トレースがあるため、HomeController がヒットしていることがはっきりとわかります。

サーバーから返されるのは次のとおりです。

404 のメッセージ: /sr/WEB-INF/viewshome.jsp 要求されたリソースは利用できません。ご覧のとおり、パスがまったく正しくありません。ルート Web コンテキスト ("sr") が前にあり、home.jsp ファイルの前にスラッシュがありません。

どんなアイデアでも大歓迎です。

ありがとう。

4

1 に答える 1

1

プレフィックスの最後にスラッシュを追加し、この回答も見てください:

private static final String VIEW_RESOLVER_PREFIX = "/WEB-INF/views/";
于 2014-02-18T22:05:58.027 に答える